Web Socket:无法在网络断开时检测到客户端连接

5

我希望能够通过 WebSocket 检测到客户端连接是否断开,即使客户端关闭了互联网。我的代码如下:

 //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()),但它没有起作用。
2个回答

3
WebSocket基于TCP,而TCP使用FIN包来关闭连接。在突然断网的情况下,由于没有发送FIN包,因此WebSocket服务器和手机都不知道已经死亡的TCP连接。
为了解决这个问题,TCP有一个叫做“keepalive”的机制。
我所做的是调整Linux内核中的TCP keepalive设置,并调用ws._socket.setKeepAlive(true)来解决这个问题。
参考资料: https://github.com/websockets/ws/issues/353

1
对于基于TCP的协议(例如Websockets),通常会在应用层发送心跳/ping数据包来回,以便双方可以轻松/快速地确定连接是否由于某种原因而中断。

1
我在我的iOS原生应用程序中使用了那个Socket Rocket服务器。因此,当客户端关闭互联网时,服务器无法删除该客户端的连接。请告诉我如何关闭该连接? - Waleed Amjad
定期从双方发送心跳/ ping数据包,就像我上面提到的那样,您可以检测到失效的连接。 - mscdex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接