我一直有一些問題與我拼湊在一起的下面的代碼。所有的事件都像廣告一樣工作,但是,如果客戶沒有首先斷開關閉事件而脫機,就不會馬上接通電話。如果你給它一分鐘左右它最終會被調用。另外,我發現如果我繼續向客戶端發送數據,它會更快地收到關閉事件,但永遠不會馬上。最後,如果客戶端正常斷開連接,那麼結束事件就會被調用。Nodejs Websocket被稱爲...最終的事件
我知道這與升級和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);
任何人都可以提出一個解決方案,以獲取即時關閉事件嗎?我試圖保持這個簡單而不使用模塊。提前致謝。
爲什麼人們爲這些事情編寫模塊是有原因的。如果您希望在不使用任何事先編寫的代碼的情況下制定符合交叉草案的websocket實現,那麼您將進行相當多的工作。 – einaros 2012-02-14 10:28:06
@einaros +1。 http://socket.io/已經處理這些問題,以及其他許多問題:http://stackoverflow.com/questions/7192747/socket-io-delay-in-firing-the-disconnect-event – 2012-02-14 11:28:28
@RohanSingh,I應該知道 - 我爲socket.io寫了websocket代碼。 – einaros 2012-02-14 15:04:12