BufferedReader 上的 Java 客户端套接字阻塞?

Posted

技术标签:

【中文标题】BufferedReader 上的 Java 客户端套接字阻塞?【英文标题】:Java Client Socket blocking on BufferedReader? 【发布时间】:2012-10-13 21:48:50 【问题描述】:

我用的是老派java.net.Socket

我的客户端连接到服务器并执行以下操作:

BufferedReader in =
   new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
String fromServer = in.readLine();

它挂在 in.readLine() 处。

我的服务器接受来自客户端的连接并执行以下操作:

PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.print("Hello client\n");

我的期望是 out.print("Hello client\n");被调用,客户端应该停止阻塞并继续。

我做错了什么?

PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
BufferedReader in =
   new BufferedReader( new InputStreamReader(clientSocket.getInputStream()));
String fromServer = in.readLine();

【问题讨论】:

【参考方案1】:

我猜你没有打电话给out.flush();见PrintWriter.flush

来自Javadoc

autoFlush - 一个布尔值;如果为 true,println、printf 或 format 方法将刷新输出缓冲区

所以Autoflush 不适用于print,您需要手动致电flush()

【讨论】:

autoflush 设置为 PrintWriter 构造函数。 具体来说,autoFlush - A boolean; if true, the println, printf, or format methods will flush the output buffer。这引自 AmitD 在他的帖子中向 PrintWriter 提供的链接。【参考方案2】:

您正在调用out.print("Hello client\n"),它不是自动刷新的,而您应该调用out.println("Hello client"),它是自动刷新的。

【讨论】:

以上是关于BufferedReader 上的 Java 客户端套接字阻塞?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Java 1.4 中设置 BufferedReader 和 PrintWriter 的超时时间?

java Socket客户端和服务器端

JAVA基础篇—模拟服务器与客户端通信

如何使用 BufferedReader 读取 DataInputStream 中的内容

Java将网页上的js下载下来。

Java 的 BufferedReader 和 InputStreamReader 类有啥区别?