socket.io连接容错

时间:2018-04-11 21:06:14

标签: javascript node.js socket.io disconnect

我需要实现一个容忍客户端和服务器之间偶尔断开连接的系统。

据我所知,socket.io实现了一个HeartBeat乒乓球,确保客户端仍处于活动状态,并在一段时间后超时。

我有两个问题:

  • 服务器端的断开连接事件是仅在心跳超时时调用,比如25秒后或者其他任何事情,或者每次客户端丢失一秒钟时都会触发吗?

  • 如果客户端每次都发生错误,我会考虑在setTimeout事件处理程序中调用disconnect,它确保在确认客户端尚未重新连接。这是一个好方法吗?

所以在代码中它会是这样的:

socket.on('disconnect', function(){
   setTimeout(cleanup, 8000);
});

function cleanup(){
    if(socket.connected) return;
    // clean up
}

1 个答案:

答案 0 :(得分:2)

  

服务器端的disconnect事件是否仅在调用时调用   心跳超时,比如说在25秒之后或其他任何事情或它发射   每次客户失踪一秒钟?

由于以下原因触发了disconnect事件:

  • 客户端断开套接字。
  • 客户端发送DISCONNECT命令。
  • 客户端不会发送“ping”字样。为X毫秒。

服务器必须每隔X毫秒从客户端接收一次ping,否则会断开套接字。

默认情况下X = 5000毫秒(5秒)

因此服务器希望客户端发送' ping'每5秒钟。默认情况下,客户端会发送' ping'每2000毫秒(每2秒)。

您可以按如下方式配置这些值:

var app = require('express')();
var http = require('http').Server(app);

var io = require('socket.io')(http, {
    pingInterval: 2000, // How many ms before the client sends a new ping packet
    pingTimeout': 5000, // How many ms without a pong packet to consider the connection closed.
});

评论来自docs

  

如果客户每次都失踪,我就会失踪   想在disconnect事件处理程序中调用setTimeout   在确保客户没有清理之后进行清理   重新连接。这是一个好方法吗?

socket.io客户端支持重新连接,所以你应该尝试这个,看看是否按你想要的方式工作。否则,您可以手动实施重新连接。

以下是如何在客户端配置重新连接

io.connect('http://localhost', {
  reconnection: true, // Whether to reconnect automatically (default: true)
  reconnectionDelay: 500, // Number of reconnection attempts before giving (default: Infinity)
  reconnectionAttempts: 10, // How long to initially wait before attempting a new reconnection (default: 1000)

});

再次从docs发表评论。您可以在文档中找到更多选项。

请注意,从服务器的角度来看,客户端重新连接是 new 客户端。我不认为它有任何理解,它是一个断开连接的客户回来。

所以我说简单的解决方案是立即清理(没有setTimeout)并让系统处理任何重新连接,就像它是一个新套接字一样。

如果清理是某种缓存,并且重新生成缓存非常昂贵,那么您可能想要尝试为重新连接的客户端重用缓存。在这种情况下,您可能希望在客户端连接或重新连接时传递到客户端的GUID,以便服务器可以重新识别重新连接的套接字并将其重新连接到其缓存的数据记录。这将变得混乱,如果可以,最好坚持使用简单的解决方案。

另一种方法可能是每隔一段时间进行垃圾收集,而不是执行setTimeout。保留客户端上次使用的记录(在缓存中)。每30分钟(或您选择的任何时间间隔)查看缓存并删除暂时未被查看的客户的记录。在这种情况下,您还需要使用GUID方法,以便重新连接客户端可以重新连接到其缓存的记录。