Сумасшедшее поведение, основанное на соединении с сокетом Java.
Представьте, что у вас есть прослушиватель сокетов на основе Mina-Framework.Здесь у вас есть возможность подключиться с несколькими клиентами к этому слушателю.Допустим, у нас есть два клиента: (1) Putty и (2) написанная пользователем Java-программа, которая использует метод readLine () - метод BufferedReader для чтения строки из этого сокета в цикле while.
Примерно так:
public static void main(String[] args) {
Socket socket = new Socket("host-ip", port);
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while (true) {
line = reader.readLine();
if (null == line) {
System.out.println("Stream eof.");
return;
}
//Do something with your line
System.out.println("Line:"+line);
}
System.out.println("Connection null.");
}
Теперь вы запускаете обе программы.Имя хоста и порт одинаковы для этой программы и Putty:
(1) Putty показывает входящие данные (также).Он отлично работает.
(2) Ваша программа также отлично работает в течение нескольких минут.Внезапно линейный объект становится равным нулю, и соединение с сокетом должно быть повторно подключено.В случае строки == null Putty продолжает показывать входящие данные.Так что для меня поток сокетов все еще существует, и данные все еще поступают.
Итак, мой вопрос: что здесь произошло?Почему в любом случае Putty может обрабатывать этот поток сокетов?Почему цикл Java аварийно завершает работу и не может обработать этот поток, и поэтому показывает все ~ 3-5 минут в нулевом регистре?Имеет ли смысл оба случая в одно и то же время?
Существуют ли обстоятельства, при которых метод readLine даст нулевое значение?Основываясь на Java API, единственным случаем должен быть конец потока.Кто-нибудь знает, как Putty обрабатывает «ноль»?
Большое спасибо за любые объяснения.
Alex