【问题标题】:Why does the reconnect function not trigger on manual reconnect Socket.IO为什么手动重新连接Socket.IO时不会触发重新连接功能
【发布时间】:2020-01-15 22:51:02
【问题描述】:

当节点服务器使用socket.disconnect(true); 断开客户端连接时,我使用socket.open() 在客户端再次手动打开连接。

问题是当socket.open() 被触发时,socket.on('reconnect', (attemptNumber) => { 函数没有被触发。 socket.on('connect', () => { 工作正常,但我希望里面的代码只在服务器关闭连接后重新连接时执行。 为什么重新连接功能在手动重新连接时不起作用?我可以做些什么来修复或解决这个问题?

【问题讨论】:

  • 因为您没有“重新连接”。你正在连接。 reconnect 事件及其关联的attemptNumber 仅在套接字尝试自动重新连接时发生(因为它因各种意外事件而失去连接,例如服务器重新启动、网络连接丢失等)。当服务器强行断开套接字时,套接字确切地知道它断开的原因并且不会尝试重新连接。所以socket.open() 始终是连接而不是重新连接。
  • 我得问问。当服务器断开您的连接时,您为什么会自动重新连接? socket.io 没有这样做是有原因的。大多数时候,您希望以不同的方式处理服务器强制断开连接,而不仅仅是强制另一个连接。就像服务器断开连接的原因是什么?您不想根据这些原因采取不同的行动吗?
  • 由于凭据超时,服务器正在断开此人的连接。前端获取新凭据并重新连接到服务器。
  • @gforce301 如果你要说什么,我希望你直接出来说。
  • “你本可以走上留下解释的道路”。我确实在我的第一条评论中解释了它。

标签: javascript node.js socket.io


【解决方案1】:

您可以像在这个非常简单的实现中一样处理它:

class SocketService {
    .
    .
    .
    static registerSocket(opts) {
        socket.on('open', () => { 
            console.log('socket connected')
            socket.onclose = (e) => {
                console.log('Socket is closed. Reconnect will be attempted in 1.5 second.', e.reason); 
                setTimeout(() =>
                    /* 
                    * Try connect again after 1.5s, 
                    * could be improved with a while 
                    * and a number max of retries
                    */
                    SocketService
                        .registerSocket(opts)
                ,1500); 
            };
        });
        socket.onerror = () => {
            // Handle first connection error here
        };
    }
}

以这种方式实施,你有一些保险。

第一个是确保您正在处理重新连接逻辑,第二个是您也在处理连接错误

【讨论】:

    猜你喜欢
    • 2016-03-28
    • 2017-11-21
    • 2013-12-27
    • 2012-05-28
    • 2019-07-06
    • 2012-10-12
    • 2011-11-22
    • 2018-01-28
    • 1970-01-01
    相关资源
    最近更新 更多