В чем разница в конце потока между Java Socket и Node.js net.Socket - PullRequest
0 голосов
/ 17 октября 2018

Я знаю, что если я использую Java BufferedReader.readLine (), я могу достичь конца потока, когда readLine () == null, что сделает мой сокет непригодным для дальнейшего чтения, и мне придется создать еще один дляполучить следующий ответ.

Допустим, я отправляю сообщение на сервер каждые 10 секунд.

Сервер закрывает соединение, если в течение последних 60 секунд не было никаких действий.

Почему этот фрагмент кода в Node.js работает непрерывно и никогда не прекращает получать ответы:

var client = new net.Socket();

function sendMsg()
{
    client.write(msg);
    console.log('Write:\n' + msg);
}

client.connect(PORT, HOST, function() {
    console.log('TCP: ' + HOST + ':' + PORT + '\n' + msg + '\n');
    setInterval(sendMsg, 10000);
});

client.on('data', function(data) {
    console.log('Received:\n' + data);
});

client.on('close', function() {
    console.log('Connection closed');
});

Я прочитал в Node.js документация , что сокету необходимо получить пакет FIN для генерации события 'end', которое закрывает поток.

Итак, двумя словами:

  • Java закрывает поток, если больше нечего читать.
  • Node.js закрывает поток после получения пакета FIN ине волнует, если поток пустой.

Правильно ли я понимаю, что эти два не очень сопоставимы по своему отношению, или есть ли способ реализовать нечто подобное в Java?

В настоящее время я прекращаю читать поток после встречи с определенной фразой и продолжаю, когда я уверен, что есть еще что почитать позже.Пока это работает, но я знаю, что это уродливый хакер и очень подвержен ошибкам.

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