nodejs websocket检测到断开连接的套接字

我有一个nodejs websocket服务器,我有以下问题。

当我的客户端连接到服务器并正常终止时,在这些套接字上调用onclose方法,并对封闭的套接字执行清理操作。

当客户端由于networking而断开连接时,不会调用onclose方法。 是否有任何超时设置如此onclose超时后自动调用?

我正在使用ws包在nodejs中的websocket服务器

默认的ws实现没有从客户端的networking断开callback

你可以在这里find一个keepAlive的实现

我不知道为什么我的职位是downvoted。 至less发表评论有什么不对?

要检测断开连接,您需要有一些stream量。 如果您的应用程序产生持续的stream量,那么您可以做一些事情,例如每次收到某个事件时重置一个计数器,并在计数器用完时考虑连接失败。

否则,你应该可以使用WebSocket提供的ping。 这些不在浏览器中公开,但是Node.js的WebSocket库可能允许您打开它们并在ping失败时收到通知。

那么我会试着用两个例子来回答你的问题。 尝试分析他们两个,并了解他们如何工作。 他们都经过testing和工作。

1- Websocket:

服务器:

 var WebSocketServer = require('websocket').server; var http = require('http'); var server = http.createServer(function(request, response) { console.log((new Date()) + ' Received request for ' + request.url); response.writeHead(404); response.end(); }); server.listen(3000, function() { console.log((new Date()) + ' Server is listening on port 3000'); }); wsServer = new WebSocketServer({ httpServer: server, autoAcceptConnections: false }); function originIsAllowed(origin) { return true; } wsServer.on('request', function(request) { if (!originIsAllowed(request.origin)) { request.reject(); console.log((new Date()) + ' Connection from origin ' + request.origin + ' rejected.'); return; } var connection = request.accept('echo-protocol', request.origin); console.log((new Date()) + ' Connection accepted.'); connection.on('message', function(message) { if (message.type === 'utf8') { console.log('Received Message: ' + message.utf8Data); connection.sendUTF(message.utf8Data); } else if (message.type === 'binary') { console.log('Received Binary Message of ' + message.binaryData.length + ' bytes'); connection.sendBytes(message.binaryData); } }); connection.on('close', function(reasonCode, description) { console.log((new Date()) + ' Peer ' + connection.remoteAddress + ' disconnected.'); }); }); 

客户:

 <!DOCTYPE html> <html> <head> <title>Web socket Experiment</title> <script type="text/javascript"> function callWebSocket() { var socket = new WebSocket("ws://localhost:3000", 'echo-protocol'); socket.onopen = function () { alert("Hello, Connected To WS server"); }; socket.onmessage = function (e) { alert("The message received is : " + e.data); }; socket.onerror = function (e) { alert("An error occured while connecting... " + e.data); }; socket.onclose = function () { alert("hello.. The coonection has been clsoed"); }; } </script> </head> <body> <input type="button" value="Open Connecton" onclick="callWebSocket()" /> </body> </html> 

2- Socket.io:

服务器:

 var http = require('http'); var app = require('express')(); var httpServer = http.createServer(app) var io = require('socket.io')(httpServer); app.get('/', function(req, res) { res.sendfile(__dirname + '/index.html'); }); io.on('connection', function(socket) { socket.emit('news', { hello: 'world' }); socket.on('my other event', function(data) { console.log(data); }); socket.on('disconnect', function(data) { console.log('disconnect!'); }); }); httpServer.listen(3000); 

客户:

 <html> <head> <script src="https://cdn.socket.io/socket.io-1.4.5.js"></script> <script> var conn_options = { 'sync disconnect on unload':false }; var socket = io.connect('http://localhost:3000',conn_options); socket.on('news', function (data) { console.log(data); socket.emit('my other event', { my: 'data' }); }); </script> </head> <body> </body> </html>