BufferedReader прикован к сокету, как работает readLine ()! = Null?

1

Я немного смущен, что происходит здесь. Пройдя через Head First Java, я создаю многопоточный сервер. Часть, которую я не понимаю, здесь, где читатель - BufferedReader, прикованный к InputStream (socket.getInputStream()):

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 от активации до тех пор, пока не вернет строку. Мой вопрос в том, как он обнаруживает, что во входном потоке есть что-то, как он знает, когда он становится нулевым?

Теги:
multithreading
sockets
blocking

2 ответа

2
Лучший ответ

Мой вопрос в том, как он обнаруживает, что во входном потоке есть что-то, как он знает, когда он становится нулевым?

Это больше socket.getInputStream() на InputStream из socket.getInputStream() чем BufferedReader, действительно. Любой вызов InputStream.read() будет блокироваться до тех пор, пока не будут доступны данные, если поток не будет закрыт. Поэтому, если сервер не предоставляет никаких данных, но сокет все еще открыт, вызов блокируется.

Если соединение закрыто (с любого конца), тогда все остальные данные будут считаны, а затем будущие вызовы read возвращают -1, чтобы указать, что поток закрыт.

BufferedReader.readLine() возвращает только null когда базовый читатель возвращает, что больше не будет данных, что в случае InputStreamReader произойдет только в том случае, если базовый поток был закрыт.

  • 0
    Это отлично ответило на мой вопрос! Поэтому InputStream просто сидит там, пока сокет открыт . Постоянно ли проверяются данные через какой-то цикл для обновления?
  • 0
    @Kameron: Я не уверен, что ты имеешь в виду, я боюсь. Способ предоставления данных будет зависеть от реализации как в терминах JVM, так и в ОС.
Показать ещё 1 комментарий
1

readLine() вернет значение null, если сокет или OutputStream закрыты с другой стороны. Проведите тест, чтобы увидеть, как он работает

Ещё вопросы

Сообщество Overcoder
Наверх
Меню