0

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

这是代码片段

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();

}

谢谢您的帮助

4

4 回答 4

3

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

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

int read =in.read(reception);

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

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

于 2012-09-10T14:27:52.910 回答
1

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

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

于 2012-09-10T14:28:48.030 回答
1

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

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

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

于 2012-09-10T18:24:42.880 回答
0

看看这个教程文档:http ://docs.oracle.com/javase/tutorial/networking/sockets/readingWriting.html 这可能会帮助你

于 2012-09-10T14:32:37.760 回答