【问题标题】:Socket.IO disconnection problem before closing window关闭窗口前Socket.IO断开问题
【发布时间】:2014-04-09 15:24:19
【问题描述】:

我试图阻止客户端与服务器断开连接。因此,在用户关闭打开应用程序的窗口之前,我会这样做:

    $(window).bind("beforeunload", function() { 
       return("Close the app?");
    });

但问题是,无论用户选择离开还是停留在应用程序打开的页面上,客户端都会在我选择选项之前与服务器断开连接(停止侦听)。因此,如果用户选择留在页面上,则不会从服务器发送或接收任何内容。

为什么会这样?如何预防?

【问题讨论】:

    标签: socket.io


    【解决方案1】:

    我的项目中遇到了完全相同的问题。
    调用socket.connect()时,应将连接的sync disconnect on unload参数设置为false(默认为true):

    var conn_options = {
      'sync disconnect on unload':false
    };
    socket = io.connect(url, conn_options);
    

    您可以在此处找到更多连接选项:https://github.com/LearnBoost/socket.io/wiki/Configuring-Socket.IO

    附:希望它对你来说仍然是真实的:)

    UPD。
    由于文档已更改,false 现在是默认值 sync disconnect on unload

    【讨论】:

    • 实际上默认情况下它是 false ..它在你提到的同一个文档中
    • 尝试为遇到!Modernizr.websockets 的浏览器将其设置为true,但它似乎只在refresh 上触发,而不是close。还有其他方法吗?...
    • @Nav 我可以看到 doc 中的默认值已在 12 年 10 月更新,因此在我发布答案时默认值为 true。无论如何,感谢您的通知,我会更新答案。
    • 好吧,尽管它不再适用于 OP,但这对我来说非常有用,因为我在关闭浏览器时无法断开连接 :)
    【解决方案2】:

    您可能无法避免该问题,因为据我所知,在关闭窗口时“beforeunload”之前没有触发其他事件。但是,当用户选择不退出页面时,您可以通过在窗口关闭对话框的回调中要求套接字重新连接来解决此问题。重新连接非常简单,只需:

    socket.connect()
    

    这是另一个更详细地描述重新连接的问题:

    How to reconnect as soon as disconnect happens

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-29
      • 2021-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多