java - BufferedReader readLine() block

标签 java sockets bufferedreader

当使用 readLine() 接收数据时,即使我在消息末尾放置了一个“\n” 在发送消息时使用 .flush,读取我的消息的 while 循环仍然阻塞。 只有在关闭套接字连接时,它才离开循环。

这是客户端代码:

bos = new BufferedOutputStream(socket.
            getOutputStream());
bis = new BufferedInputStream(socket.
            getInputStream());
osw = new OutputStreamWriter(bos, "UTF-8");
osw.write(REG_CMD + "\n");
osw.flush();

isr = new InputStreamReader(bis, "UTF-8");
BufferedReader br = new BufferedReader(isr);

String response = "";
String line;

while((line = br.readLine()) != null){
   response += line;
}

和服务器的代码:

BufferedInputStream is;
BufferedOutputStream os;

is = new BufferedInputStream(connection.getInputStream());
os = new BufferedOutputStream(connection.getOutputStream());

isr = new InputStreamReader(is);

String query= "";
String line;

while((line = br.readLine()) != null){
   query+= line;
}

String response = executeMyQuery(query);
osw = new OutputStreamWriter(os, "UTF-8");

osw.write(returnCode + "\n");
osw.flush();

我的代码在服务器 while 循环中阻塞。 谢谢。

最佳答案

BufferedReader 将继续读取输入,直到它到达末尾(文件或流或源等的末尾)。在这种情况下,“结束”是套接字的关闭。因此,只要 Socket 连接打开,您的循环就会运行,而 BufferedReader 只会等待更多输入,每次到达 '\n' 时都会循环。

关于java - BufferedReader readLine() block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15521352/

相关文章:

在 sockaddr 和 sockaddr_in6 之间转换

java - 在 jSTL 中使用 javascript 变量

android - 在 Android 中的两个进程之间保留一个打开的套接字

java - JDBC:更新表的最佳方法?

sockets - 两个 TCP 套接字之间基于内核的 (Linux) 数据中继

java - (Java) 套接字的 BufferedReader 一次仅读取一行,在接收下一行之前需要客户端输入

Java - 扫描仪在一定数量的行后不扫描

java - 如何读取文本文件中的特定行并返回其中的一部分?

java - 在本地存储库中安装第三方jar是否需要pom文件配置?

java - MethodHandles.lookup().lookupClass() 与 getClass()