【问题标题】:send response to a client from a server从服务器向客户端发送响应
【发布时间】:2012-09-10 14:22:11
【问题描述】:

我想在客户连接后向他发送响应

这里是sn-p的代码

try {

    while (true)

    {
        in = socket.getInputStream();
        out = socket.getOutputStream();

        byte[] reception = new byte[1024];
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        int read = in.read(reception);

        String bufferServer = "Buffer Server ";
        baos.write(reception, 0, read);
        reception = baos.toByteArray();
        String chaine = new String(reception, "Cp1252");
        System.out.println("Reception from client : " + chaine);

        byte[] bufferServeurToClient = bufferServer.getBytes();
        out.write(bufferServeurToClient); // send to client
        out.flush();
    }
}

客户端可以发送多个请求,这就是为什么我使用 while(true) 来监听请求直到客户端断开连接。

问题是我从客户端的服务器没有收到任何东西。 如果我删除 while(true) 它可以工作并且我在客户端收到变量“bufferServeurToClient”

编辑:客户端现在可以工作,但是当我打印响应时,我的字符串后面有很多奇怪的字符(正方形),为什么?

String ip = InetAddress.getLocalHost ().getHostAddress ();
        Socket socket = new Socket(ip, port);
        System.out.println("SOCKET = " + socket);

         InputStream in = socket.getInputStream();
    BufferedInputStream bis = new BufferedInputStream(in);
    OutputStream out = socket.getOutputStream();
    BufferedOutputStream bos=new BufferedOutputStream(out);
    String bufferClient="Buffer Client ";

    byte[] bufferClientToServer= bufferClient.getBytes();
    out.write(bufferClientToServer);

    byte[] reception = new byte[1024] ;          

    int read;

    while ((read = bis.read(reception)) != -1){
        String chaine = new String( reception , "Cp1252" );
        System.out.println("Reception from server: " + chaine);


    }
    bis.close();
    bos.close();

}

感谢您的帮助

【问题讨论】:

  • 程序在调试器中逐行运行时会阻塞在哪里?
  • @Philipp 它在“int read =in.read(reception);”处阻塞

标签: java sockets outputstream


【解决方案1】:

客户端可以发送多个请求,这就是为什么我使用 while(true) 来监听请求直到客户端断开连接。

如果客户端可以发送多个请求,您将需要一种区分它们的方法 - 响应之间的差异。目前,您只是假设对read 的一次调用就可以完成这项工作:

int read =in.read(reception);

这可以读取请求的部分,或者可能读取多个请求。解决此问题的常用选项是使用某种分隔符(例如,每个文本行一个请求)或使用长度前缀,其中(例如)每个请求或响应的前四个字节表示还有多少数据。

现在你根本没有展示你的客户端是什么样子 - 但我猜你实际上是在等待服务器关闭连接,当然你永远不会在 while(true) 循环中这样做在那儿。所以这是您需要修改的另一段代码。

【讨论】:

  • 感谢您的帮助和回复。目前,我已经管理通过线程连接的客户端(客户端一个线程)。但实际上我不区分请求(认为读取变量会在每次请求时发生变化)。目前服务器端在客户端完成工作后关闭连接。我无法显示客户端代码,因为它是机密的(客户端已完成,我只有服务器端的麻烦)
  • @user799698:我不明白你怎么能认为客户端代码在你使用服务器端代码之前就已经完成了。您几乎肯定需要同时更改两者以使事情稳定运行 - 为请求和响应添加长度前缀可能是最简单的方法。请注意,您不必显示 真实 客户端代码 - 只需显示相同问题的客户端代码。一个简短但完整的程序(双方)演示该问题将是理想的。
  • 非常感谢您的帮助,但我无法控制客户端,因为这是一个我没有做过的应用程序,它已经由另一个人开发了很长时间。我只能从 jsp 页面发送请求(我对背后的代码一无所知)。我的工作包括使用新规范改进服务器端。顺便开发个客户端测试一下
  • 好的,我没有客户端代码,但我设法创建了一个简单的客户端(没有多个请求,因为我不知道该怎么做),它代表了与以前相同的问题(即没有收到服务器的响应)。谢谢
  • @user799698:如果您无法更改客户端代码,那么您就彻底崩溃了。您无法确定何时收到了整个客户请求。您需要先修复协议。
【解决方案2】:

如果您发送多个请求,它们可能会被视为单个请求,这毫无价值。这是因为流没有消息的概念,因此如果您写入许多字节,它们可以以任何方式读取。例如一次一个字节,或者一次全部。

无论如何,您至少应该得到一个回复​​。

【讨论】:

  • 感谢您的帮助,但这是主要问题,因为我没有收到任何东西!当我调试它时,它会阻塞在“int read =in.read(reception);”但我仍然可以 syso 读取值。所以我不明白为什么什么都没有发送。
  • 这没有任何意义,因为第一次运行循环与运行一次循环完全相同。 while 循环不会改变套接字的行为方式。我会确保在 while 循环之后没有发生任何重要的事情,并发布你是如何从套接字读取的。
  • 谢谢,我已经试过好几次了。与while(真)。客户端保持连接但什么也没有收到。如果我取消循环,客户端做一个请求,收到来自服务器的响应,然后他自动断开连接
  • 在这种情况下,我怀疑问题出在客户端。在服务器断开连接之前,它不会读取数据。例如BufferedReader.readLine() 会这样做。尝试使用for(int i=0;i<2;i++) 而不是while(true)
  • 感谢您的帮助。但是服务器永远不会断开连接,他总是保持运行。我试过你的解决方案。它适用于 for(int i=0;i_
【解决方案3】:

在打印任何内容之前,您正在客户端读取直到 EOS,并且服务器永远不会关闭连接,因此没有 EOS。

您不需要所有这些 ByteArrayOutputStreams。仔细查看您的代码,您会发现它们可以完全消除。这也将解决 EOS 问题。

如果 read() 返回 -1,服务器应该关闭套接字。

【讨论】:

  • 非常感谢,感谢您的建议,我更新了我的代码,在我检测到 -1 之前读取数据
  • @user799698 但这就是您已经在做的事情。问题是在你找到它之前没有输出。
  • 所以我需要添加“bos.write(reception,0,read);”在我的while循环中?当我打印服务器答案时,你知道为什么我有奇怪的字符(正方形)吗? (我认为是因为字节数组没有填满,所以它充满了奇怪的字符)谢谢你
【解决方案4】:

【讨论】:

  • 谢谢,我去看看
猜你喜欢
  • 1970-01-01
  • 2017-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-07
  • 2014-10-08
  • 2014-05-12
  • 1970-01-01
相关资源
最近更新 更多