我有一个经典的Java客户端/服务器应用程序,其中客户端和服务器通过TCP连接交换消息。
当一个元素,让我们称之为Receiver(无论是客户端还是服务器),必须接收消息,它会监听并等待来自其他元素的消息,让我们称之为发件人。 接收器通过以下代码实现它:
BufferedReader myBufferedReader = new BufferedReader(new InputStreamReader(mySocket.getInputStream()));
receivedMessageCompleto = myBufferedReader.readLine();
一段时间后,发件人将发送一条实现以下代码的短信:
String messageCompleto = "whatever text";
String packetSend = messageCompleto + '\n' ;
DataOutputStream myDataOutputStream = new DataOutputStream(mySocket.getOutputStream());
myDataOutputStream.writeBytes(packetSend );
问题是: 在某些情况下" myBufferedReader.readLine()"获取空值,但我非常确定发件人没有发送消息NULL。 问题是:为什么?
根据我的理解,接收器应该保持阻塞状态,直到它收到某些东西(让我们考虑超时设置为无限),然后" myBufferedReader.readLine()"只有当某些东西到来时才应该返回一个值。关键是我确定发件人没有发送空消息。
任何想法???
非常感谢您提前 福斯托
答案 0 :(得分:1)
public String readLine()
throws IOException
读取一行文字。一条线被认为是任何一条线终止的 换行(' \ n'),回车(' \ r')或回车 然后立即换行。
返回:
包含该行内容的String,不包括任何内容 行终止字符,,如果流的末尾已经为null 达到强>
如果基础流遇到EOF,基本上你会得到null
。
答案 1 :(得分:0)
正如documentation for the readLine method中所述:
<强>返回:强> 包含行内容的String,不包括任何行终止字符;如果流的末尾已经为null,则为null 达到
因此,在您的情况下,已达到流末尾。可能是套接字的远端已关闭。