套接字,BufferedReader.readline() – 为什么流没有准备好?

我正在学习java,我遇到了套接字的一些问题。 我开发了一个简单的客户端 – 服务器应用程序 – 敲门,它执行4个步骤:

  1. 客户端向服务器发送一些消息
  2. 服务器收到它们并保存到文件
  3. 服务器向客户端发回一些其他消息
  4. 客户收到它们并保存到文件

问题出现在步骤#4:客户端不接收消息并且永远不会出现循环:

while ((inStr = in.readLine()) != null) { writer.println(inStr); } 

其中in是BufferedReader类型:

  try { socket = new Socket(ipAddress, 4444); out = new PrintWriter(socket.getOutputStream(), true); in = new BufferedReader(new InputStreamReader(socket.getInputStream())); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } 

在服务器端发送消息:

  try { socket = srvSocket.accept(); out = new PrintWriter(socket.getOutputStream(), true); in = new BufferedReader(new InputStreamReader(socket.getInputStream())); } catch (IOException e) { e.printStackTrace(); } 

  out.println("test from server #1"); out.println("test from server #2"); 

在客户端我看了in.ready() – 它返回false。 在服务器端我注意out.checkError() – 它返回true;

我做错了什么 – 为什么流是空的?

任何帮助ia赞赏! 🙂

您正在使用public PrintWriter(OutputStream out, boolean autoFlush) ,它将在新行或println上自动刷新。 每次写入后都不会自动刷新。 你必须在每次写入后刷新。

这是构造函数的autoFlush参数的javadoc:一个布尔值; 如果为true ,则printlnprintfformat方法将刷新输出缓冲区

这可能/可能无法解决您的问题。 但请尝试将所有内容保留在Try Catch块中。 例如:您的ServerSocket初始化,写入程序块等。如果发生某些错误,您可能无论如何都无法使用编写器,因此初始化它没有意义。
您可以尝试写入标准输出流以进行调试而不是文件。 下面的服务器/客户端代码是您和它的工作的一个小变体。

服务器:

  Socket socket; ServerSocket srvSocket; BufferedReader in; PrintWriter out; try { srvSocket=new ServerSocket(4444); socket = srvSocket.accept(); out = new PrintWriter(socket.getOutputStream(), true); in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out.println("test from server #1"); out.println("test from server #2"); } catch (IOException e) { e.printStackTrace(); } 

客户

  Socket socket; BufferedReader in; PrintWriter out; String inStr; try { socket = new Socket("127.0.0.1", 4444); out = new PrintWriter(socket.getOutputStream(), true); in = new BufferedReader(new InputStreamReader(socket.getInputStream())); while ((inStr = in.readLine()) != null) { System.out.println(inStr); } } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }