我正在编写一个简单的 Java 客户端/服务器应用程序供我自己使用。它应该允许客户端发送单行文本消息和读取多行响应。这种通信应该可以使用相同的连接重复多次。
这是我在客户端中用于阅读回复的内容:
BufferedReader input = new BufferedReader(new InputStreamReader(server.getInputStream()));
String line;
while ((line = input.readLine()) != null) {
// processing here
}
问题在于,一旦服务器发回第一个响应,readLine() 就会阻塞,因此客户端无法发送新消息。这是可以理解的。一个天真的解决方法是让服务器通过发送某种已知的特殊字符串值来发出其输出结束的信号,然后客户端将识别该字符串值并结束读取循环。但是,是否有更好的解决方案来解决这个问题?
最佳答案
由于您的客户端应该从同一连接读取多个多行响应并处理每个响应 block , 这可能对您的情况有用:
BufferedReader input = new BufferedReader(new InputStreamReader(server.getInputStream()));
String line;
StringBuilder sb = new StringBuilder();
while ((line = input.readLine()) != null) {
if (line.equals("~~/START/~~"))
sb = new StringBuilder();
else if (line.equals("~~/END/~~")) {
doSthWithParagraph(sb.toString());
sb.delete(0, sb.length());
} else
sb.append(line);
}
您可以使用自己的特殊字符串来识别每个消息 block 的开始和结束。
关于java - 连续读取套接字的所有输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8442493/