Java BufferedReader inputstream仅在收到第一个输入之前阻塞

Java BufferedReader inputstream仅在收到第一个输入之前阻塞,java,android,sockets,Java,Android,Sockets,我正在使用套接字实现即时消息传递 我在客户端有以下Java代码: while ( true ) checkInputStream(); 下面是函数: private void checkInputStream() throws IOException { //prints once, but after the first input arrives, it prints infinitely Log.i( "MY_TAG", "CHECKING INPUT ST

我正在使用套接字实现即时消息传递

我在客户端有以下Java代码:

while ( true )
    checkInputStream();
下面是函数:

private void checkInputStream() throws IOException
{   
    //prints once, but after the first input arrives, it prints infinitely
    Log.i( "MY_TAG", "CHECKING INPUT STREAM");
    String inputLine;

    //inputStream is a BufferedReader object
    while ((inputLine = inputStream.readLine()) != null) 
    {
                //code                                                                                       
    }   
}
问题

我得到的行为是
readline()
阻塞,直到它收到第一个输入(这太棒了)。但当我发送第一条以换行符结尾的消息时,它就会一次又一次地循环,不管我是否看到发送了更多的输入

问题

这是正常的行为吗

如果是,如何使
readline()
阻塞,直到更多输入到达

我为什么在乎

我之所以希望它像第一次输入那样一直阻塞,是因为我能感觉到我正在测试的android手机过热

如何让readline()阻塞,直到更多输入到达

它会一直阻塞,直到更多输入到达。您的问题是在两个嵌套循环中调用它,其中一个忽略流的结尾


移除外部
while(true)
循环。您已经在循环,直到方法内的流结束。如果您也循环调用该方法,您将在流的末尾永远旋转。

从代码中删除while(true)循环

而不是在看到任何内容时再次检查,为什么不在再次检查之前等待几秒钟?@Epicblood,因为这样它就不会是“即时的”我建议您研究一些基于事件的套接字包,比如@Epicblood,它是一种阻塞方法。它应该在没有输入的情况下阻止。我看不出有什么理由必须阻止某些内容,这听起来像是糟糕的编码。如果我这样做,我只能收到一条消息。@KacyRaye胡说八道。
readLine()
上的内部循环将读取所有内容,直到对等方关闭连接。我将尝试并返回给您。您是100%正确的。在新消息到达之前,readline()方法正在正确阻止。我不需要外部while循环。值得一提的是,我的服务器端代码中有一个小错误。在php中,我让
strlen($buf+1)
而不是
strlen($buf)+1
@Fahim readLine()自动阻塞,直到下一个输入到达。我认为它无限循环的原因是因为我在服务器端有一个小bug。不需要计时器。@Fahim
readLine()
java.io
中的每一个其他读取方法到达某个输入、流结束或异常之前一直阻塞。这是一个阻塞模式API。你真的应该知道这一点。它无限循环的原因是因为外部循环忽略了流的末尾。这本来就没有必要。