我正在编写一个供自己使用的简单Java客户端/服务器应用程序。它应该允许客户端发送单行文本消息并阅读多行响应。使用相同的连接,这种通信应可重复多次。
这是我在客户端中用于阅读回复的内容:
BufferedReader input = new BufferedReader(new InputStreamReader(server.getInputStream()));
String line;
while ((line = input.readLine()) != null) {
// processing here
}
问题在于,一旦服务器发送回第一个响应,并且客户端无法发送新消息,则readLine()就会阻塞。这是可以理解的。一个幼稚的解决方法可能是通过发送某种已知的特殊字符串值使服务器发信号通知其输出结束,然后客户端会识别并结束读取循环。但是,是否有更好的解决方案?
由于您的客户应从同一连接读取多个多行响应,并处理每个响应块,这可能对您的情况有用:
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);
}
您可以使用自己的特殊字符串来识别每个消息块的开始和结束。
我不会将readLine
用于您的主循环,因为readLine
依赖于“未来”数据(CR或LF或CR + LF,如果已到达流的末尾,则返回null)。因此,如果CR后面没有LF,则BufferedReader
会卡住。 readLine
方法更适合于读取文件内容。
在您的情况下,我一次可以用]读取一个字符>
while ((myChar = input.read()) != -1) { // processing here, storing information in a buffer and taking appropriate actions if // A CR or LF is found }
但是即使这种行为也令人怀疑,因为Unicode字符可以超过一个字节,因此如果发送第一个字节而不发送第二个字节,则流可能会卡住。您确定您的通信是Unicode吗?如果不是,那么
InputStream
比Reader
更合适。
您好,这里的视频可能会对您有所帮助: