2012-02-14 2 views
4

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

Я понимаю, что это связано с другими событиями прослушивания, такими как upgrade и 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); 

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

+3

Существует причина, по которой люди пишут модуль для этих вещей. У вас будет довольно много работы, если вы хотите сделать перекрестный проект, соответствующий внедрению websocket, без использования какого-либо ранее написанного кода. – einaros

+0

@einaros +1. http://socket.io/ уже занимается этими вопросами и многими другими: http://stackoverflow.com/questions/7192747/socket-io-delay-in-firing-the-disconnect-event –

+0

@RohanSingh, I должен знать - я написал код websocket для socket.io. – einaros

ответ

0

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

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

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

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

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

Смежные вопросы