Я немного смущен, что происходит здесь. Пройдя через 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 от активации до тех пор, пока не вернет строку. Мой вопрос в том, как он обнаруживает, что во входном потоке есть что-то, как он знает, когда он становится нулевым?
Мой вопрос в том, как он обнаруживает, что во входном потоке есть что-то, как он знает, когда он становится нулевым?
Это больше socket.getInputStream()
на InputStream
из socket.getInputStream()
чем BufferedReader
, действительно. Любой вызов InputStream.read()
будет блокироваться до тех пор, пока не будут доступны данные, если поток не будет закрыт. Поэтому, если сервер не предоставляет никаких данных, но сокет все еще открыт, вызов блокируется.
Если соединение закрыто (с любого конца), тогда все остальные данные будут считаны, а затем будущие вызовы read
возвращают -1, чтобы указать, что поток закрыт.
BufferedReader.readLine()
возвращает только null
когда базовый читатель возвращает, что больше не будет данных, что в случае InputStreamReader
произойдет только в том случае, если базовый поток был закрыт.
readLine() вернет значение null, если сокет или OutputStream закрыты с другой стороны. Проведите тест, чтобы увидеть, как он работает