java - BufferedReader 链接到套接字,readLine() != null 是如何工作的?

标签 java multithreading sockets blocking

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

class IncomingReader implements Runnable {
    public void run() {
        String message;
        try {
            while ((message = reader.readLine()) != null){
            System.out.println("client read " + message);
            incoming.append(message + "\n");
      }

特别是

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

激活?

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

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

最佳答案

My question is, how does it detect that there is something in the inputstream, how does it know when it becomes null?

实际上,这与 socket.getInputStream() 中的 InputStream 有关,而不是 BufferedReader。除非流已关闭,否则对 InputStream.read() 的任何调用都将阻塞,直到有可用数据为止。因此,如果服务器未提供任何数据,但套接字仍处于打开状态,则调用将被阻止。

如果连接关闭(由任一端),则将读取所有剩余数据,然后以后的 read 调用将返回 -1 以指示流已关闭。

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

关于java - BufferedReader 链接到套接字,readLine() != null 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29211006/

相关文章:

java - 在 Java 中将排序数组重写为 JTextPane

java - 立即结束复杂回合的游戏

ios - 在另一个 View Controller 中停止线程

c - htonl 打印垃圾值

'sort -V' 的 Java 替代方案

java - 从 spring servlet HTTP 响应中删除 Content-Length 和 Transfer-Encoding header

java - 是否有完整的 Big-O Java 数据结构列表?

iphone - iOS - 线程不会回到主线程

Javascript 客户端从 Java Web 套接字读取

C - 如何确定 JSON 消息的字节数