Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java BufferedReader链接到套接字,readLine()如何运行无效工作?_Java_Multithreading_Sockets_Blocking - Fatal编程技术网

Java BufferedReader链接到套接字,readLine()如何运行无效工作?

Java BufferedReader链接到套接字,readLine()如何运行无效工作?,java,multithreading,sockets,blocking,Java,Multithreading,Sockets,Blocking,我对这里发生的事情有点困惑。通过headfirstjava,我正在制作一个多线程服务器。 我不理解的部分是这里,其中reader是链接到InputStream(socket.getInputStream())的BufferedReader: 特别是 while ((message = reader.readLine()) != null) 激活 我的意思是,如果没有来自服务器的输入,它不应该==null吗?如果没有,readLine()方法本身是否有某种循环来检测来自服务器流的数据 我知道re

我对这里发生的事情有点困惑。通过headfirstjava,我正在制作一个多线程服务器。 我不理解的部分是这里,其中reader是链接到InputStream(socket.getInputStream())的BufferedReader:

特别是

while ((message = reader.readLine()) != null)
激活

我的意思是,如果没有来自服务器的输入,它不应该==null吗?如果没有,readLine()方法本身是否有某种循环来检测来自服务器流的数据

我知道readLine()会“阻止”while循环激活,直到它返回一行。我的问题是,它如何检测inputstream中是否有内容,它如何知道何时变为null

我的问题是,它如何检测inputstream中是否有内容,它如何知道何时变为null

实际上,这更多地与来自
socket.getInputStream()
InputStream
有关,而不是与
BufferedReader
有关。对
InputStream.read()
的任何调用都将被阻止,直到有可用数据,除非流关闭。因此,如果服务器不提供任何数据,但套接字仍然打开,则调用将被阻止

如果连接已关闭(在任意一端),则将读取任何剩余数据,然后未来的
read
调用将返回-1以指示流已关闭


BufferedReader.readLine()
仅在底层读取器返回不再有数据时才会返回
null
,而在
InputStreamReader的情况下,只有在底层流已关闭时才会发生这种情况。

readLine()当套接字或OutputStream在另一侧关闭时,将返回null。做一个测试看看它是如何工作的

这完美地回答了我的问题!所以只要套接字打开,InputStream就一直存在。它是否经常通过某种循环检查数据以进行更新?@Kameron:恐怕我不知道你的意思。从JVM和操作系统的角度来看,数据可用的方式将非常具体于实现。我想我已经得到了答案。非常有用。
while ((message = reader.readLine()) != null)