gpt4 book ai didi

java - Socket 的 PrintWriter 在关闭之前不会发送

转载 作者:行者123 更新时间:2023-12-02 02:39:47 26 4
gpt4 key购买 nike

我的客户端代码如下所示:

Socket s = new Socket(server.getHostName(), server.getPort());
PrintWriter p = new PrintWriter(s.getOutputStream());
p.println(message);
p.flush();
s.shutdownOutput();

BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String newLine;
StringBuffer response = new StringBuffer();
while((newLine = br.readLine()) != null)
response.append(newLine);
System.out.println(response.toString());
p.close();
br.close();

服务器代码如下:

BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String nextLine;
StringBuffer request = new StringBuffer();

System.out.println("Starting read....");
String nextline;
while((nextline = br.readLine()) != null){
System.out.println(nextline);
request.append(nextline);
}
System.out.println("Message recived!!");
System.out.println("Request: " + request);

PrintWriter p = new PrintWriter(s.getOutputStream());
p.println("Hello, fileclient!");
System.out.println("Message sent!!");

p.close();
br.close();

在我放置s.shutDownInput()行之前,服务器代码将卡在br.readLine()处。我设法解决这个问题的方法是关闭PrintWriter 某种方式,通过 p.close() 或通过当前的方式,但不关闭套接字就像通过 p.close() 关闭 PrintWriter 一样。至此,客户端与服务端的交互就完美了。

为什么 PrintWriterBufferedReader 直到 PrintWriter 以某种方式关闭才发送/接收?

最佳答案

它与PrintWriter没有任何关系。这是您的应用程序协议(protocol)错误。

  • 服务器正在循环读取行,直到流结束。

  • 客户端正在发送一行,然后没有关闭套接字,因此没有发送流结束(直到您添加关闭)。

  • 服务器正在响应。

  • 客户端正在阅读。

因此,在服务器退出循环之前,客户端不会读取任何内容,而服务器也不会退出循环,因为客户端正在读取而不是关闭。

所以你下定决心吧。也许服务器应该只读取一行。

关于java - Socket 的 PrintWriter 在关闭之前不会发送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45684078/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com