Событие закрытия веб-сокета Nodejs вызвано ... В конце концов - PullRequest
5 голосов
/ 14 февраля 2012

У меня были некоторые проблемы с кодом ниже, который я собрал.Однако все события работают так, как было объявлено, когда клиент отключается от сети без предварительного отключения события закрытия, он сразу не получает вызов.Если вы дадите ему минутку или около того, в конце концов вам позвонятКроме того, я нахожу, что если я продолжаю отправлять данные клиенту, он обнаруживает событие закрытия быстрее, но не сразу.Наконец, если клиент корректно отключается, конечное событие вызывается просто отлично.

Я понимаю, что это связано с другими событиями прослушивания, такими как обновление и ondata.

Я также должен заявить, что клиент является встроенным устройством.

client http request:
GET /demo HTTP/1.1\r\n
Host: example.com\r\n
Upgrade: Websocket\r\n
Connection: Upgrade\r\n\r\n


//nodejs server (I'm using version 6.6)
var http = require('http');
var net = require('net');
var sys = require("util");

var srv = http.createServer(function (req, res){
});

srv.on('upgrade', function(req, socket, upgradeHead) {

  socket.write('HTTP/1.1 101 Web Socket Protocol Handshake\r\n' +
               'Upgrade: WebSocket\r\n' +
               'Connection: Upgrade\r\n' +
               '\r\n\r\n');

  sys.puts('upgraded');

  socket.ondata = function(data, start, end) {
    socket.write(data.toString('utf8', start, end), 'utf8'); // echo back
  }; 

  socket.addListener('end', function () {    
    sys.puts('end');  //works fine
  });

  socket.addListener('close', function () {
    sys.puts('close');  //eventually gets here
  });

});
srv.listen(3400);

Кто-нибудь может предложить решение для немедленного закрытия события закрытия?Я пытаюсь сделать это простым без использования модулей.Заранее спасибо.

1 Ответ

1 голос
/ 06 марта 2014
Событие

close будет вызвано после того, как соединение с сокетом TCP будет закрыто тем или иным концом, за исключением нескольких случаев, когда система «не осознает», что сокет уже закрыт, но это редкие случаи.Поскольку WebSockets запускаются с HTTP-сервера запросов, он может просто поддерживать работу до истечения времени ожидания сокета.Это включает в себя задержку.

В вашем случае вы пытаетесь выполнить рукопожатие , а затем отправлять данные туда и обратно, но WebSockets - более сложный процесс, чем этот.
Рукопожатиепроцессу требуется некоторая процедура security для проверки обоих концов (сервера и клиента), и это HTTP-совместимые заголовки.Но разные черновые версии, поддерживаемые разными платформами и браузерами, реализуют это по-разному, поэтому ваша реализация должна учитывать это и следовать официальной документации по спецификации WebSockets на основе версий, которые вы должны поддерживать.

Затем отправкаи получение данных через WebSockets не является чистой строкой.Фактические данные, отправляемые по протоколу WebSockets, имеют слой формирования данных , который включает добавление заголовка к каждому отправляемому сообщению.Этот заголовок содержит подробную информацию о отправляемом сообщении, маскировке (от клиента к серверу), длине и многом другом.формирование данных снова зависит от версии WebSockets, поэтому реализации будут незначительно отличаться.

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

Лучшим вариантом здесь будет ws - фактический pure WebSockets .
Socket.IO не подходит для вашего случая, так как это гораздо более сложная и тяжелая библиотека с несколькими спискамипротоколов поддерживают с помощью откатов и имеют некоторую абстракцию, которая может быть не тем, что вы ищете.

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