检测 socket.io 断开连接并销毁客户端事件

detect socket.io disconnect and destroy events client side

我有 html 页面由 node.js 服务器发送,socket.io 组件连接到该服务器,如下所示:

var socket = io();

还有几个套接字事件:

socket.on('server-message', function(type, content) {
    ...
});

socket.on('server-update', function(type, content) {
    ...
});

问题是当服务器停止时,我收到客户端错误:

https://example.com/socket.io/?EIO=3&transport=polling&t=LptmQyC net::ERR_CONNECTION_REFUSED

一旦服务器再次启动,它会在 30 秒后崩溃。

如果服务器不再可用,我似乎可以使用检测并销毁所有与套接字相关的事件,然后通过页面刷新或某些按钮重新连接。

也许有人可以帮我解决这个问题。

我不认为可以对错误做很多事情,它的内部 socket.io 错误是服务器轮询不成功的结果。

为了更好地理解,一旦连接被切断,socket.io 进入 ajax 轮询并将尽快尝试重新连接(意味着服务器再次启动时)。

另一方面,重新连接后服务器崩溃可以很容易地解决。您提供的代码仅在如何连接方面起作用,您缺少断开连接和可选的处理程序 - 重新连接。

我将向您展示如何添加到此代码以管理断开连接(并防止服务器在恢复后崩溃)。

首先连接到服务器:

var socket = io();

之后立即创建断开连接事件(顺便说一句,它也是服务器端断开连接事件的代码):

socket.on('disconnect', function() {
    destroy_socket_events();
});

创建将销毁所有听众的函数:

var destroy_socket_events = function() {
    socket.off('disconnect');
    socket.off('server-message');
    socket.off('server-update');
    // add all other socket events that you have in here ...
};

现在要发生的事情是这样的:

  • 已建立连接
  • 服务器已停止
  • 客户端触发断开连接事件
  • 函数销毁所有套接字侦听器
  • 服务器已备份
  • 客户端重新连接(socket.io 会因为轮询而重新连接)
  • 此时没有任何侦听器被触发

因此您可以安全地重新初始化所有代码并再次正确附加侦听器。