Web Socket:无法检测到互联网断开连接的客户端连接

如果客户端使用Web套接字closures互联网,我想检测客户端连接。 我的代码是:

//Include util library var util = require('util'); // Include underscore library var _ = require('underscore')._; //For websocket var webSocketServer = new (require('ws')).Server({port: (process.env.PORT || 5000)}), webSockets = {} // userID: webSocket // CONNECT /:userID // wscat -c ws://localhost:5000/1 webSocketServer.on('connection', function (webSocket) { var userID = webSocket.upgradeReq.url.substr(1); //console.log('User_id is ',userID); webSockets[userID] = webSocket util.log('User_id: [' + userID + '] enter in connected users list of [ ' + Object.getOwnPropertyNames(webSockets)+' ]') // Call function which check id exist in letswalkee DB table check_userid(userID); // Send msg like: [fromUserID, text] [1, "Hello, World!"] webSocket.on('message', function(message) { util.log('Received from [' + userID + ']: ' + message) var messageArray = JSON.parse(message) var toUserWebSocket = webSockets[messageArray[0]] if (toUserWebSocket) { util.log('Sent to [' + messageArray[0] + ']: ' + JSON.stringify(messageArray)) messageArray[0] = userID toUserWebSocket.send(JSON.stringify(messageArray)) } }) webSocket.on('close', function () { delete webSockets[userID] util.log('User_id Deleted from connected users: [ ' + userID+' ]'); }) webSocket.on('disconnect',function() { console.log('hello i am disconnected'); }); }) 

我用这个代码(webSocket.on('disconnect',function()),但没有工作。

对于基于TCP的协议(例如Websockets),通常所做的是心跳/ ping数据包在应用层来回发送,这样每一方都可以很容易/快速地确定连接是否由于某种原因而消失。

WebSocket是基于TCP和TCP使用FIN数据包来closures连接。 在突然失去互联网连接的情况下,WebSocket服务器和电话都不知道已经死了的TCP连接,因为没有发送FIN数据包。

为了解决这个问题,TCP有一个叫keepalive的机制。

我所做的解决这个问题的方法是调整Linux内核中的TCP keepalive设置,并调用ws._socket.setKeepAlive(true).

参考: https : //github.com/websockets/ws/issues/353