【问题标题】:detect socket.io disconnect and destroy events client side检测socket.io断开连接和销毁事件客户端
【发布时间】:2017-06-30 06:57:28
【问题描述】:

我有由 node.js 服务器和 socket.io 组件发送的 html 页面,它像这样连接到该服务器:

var socket = io();

还有几个socket事件:

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 秒后崩溃。

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

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

【问题讨论】:

    标签: javascript node.js sockets socket.io connection


    【解决方案1】:

    我不相信这个错误可以做很多事情,它的内部 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 会因为轮询而这样做)
    • 此时从未触发任何侦听器

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

    【讨论】:

      猜你喜欢
      • 2012-05-17
      • 2015-11-21
      • 2016-07-08
      • 1970-01-01
      • 1970-01-01
      • 2014-04-14
      • 2017-07-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多