сокетное соединение работает и разрывается одновременно - PullRequest
0 голосов
/ 20 сентября 2019

Сумасшедшее поведение, основанное на соединении с сокетом 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...