TCP套接字:为什么BufferedReader.readLine()得到NULL?

时间:2015-10-22 11:31:49

标签: java sockets tcp

我有一个经典的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()"只有当某些东西到来时才应该返回一个值。关键是我确定发件人没有发送空消息。

任何想法???

非常感谢您提前 福斯托

2 个答案:

答案 0 :(得分:1)

public String readLine()
                throws IOException
  

读取一行文字。一条线被认为是任何一条线终止的   换行(' \ n'),回车(' \ r')或回车   然后立即换行。

返回:

  

包含该行内容的String,不包括任何内容   行终止字符,,如果流的末尾已经为null   达到

如果基础流遇到EOF,基本上你会得到null

答案 1 :(得分:0)

正如documentation for the readLine method中所述:

  

<强>返回:       包含行内容的String,不包括任何行终止字符;如果流的末尾已经为null,则为null   达到

因此,在您的情况下,已达到流末尾。可能是套接字的远端已关闭。