【问题标题】:Force upgrade after fallback to polling?回退到轮询后强制升级?
【发布时间】:2017-06-27 03:57:44
【问题描述】:

这可能是一个愚蠢的问题,但我想知道是否有办法强制 socket.io 定期重试使用 websocket 作为传输而不是轮询?

我注意到有时我的应用程序无法建立 websocket 连接(握手失败:ERR_CONNECTION_RESET)。然后 Socket.io 正确地回退到轮询,但它似乎永远不会尝试再次切换回 websockets,即使它会工作。我的观察正确吗? 如果是这样,您有什么建议?

如果您需要任何代码,请告诉我。我真的想不出一个相关的代码示例,因为这更像是一个理论问题。

【问题讨论】:

  • 我会说修复您的服务器以不拒绝连接。或者,如果您处于轮询模式,您可以每隔一段时间断开连接并从客户端重新连接,它会自动再次尝试 webSocket。
  • 是的。这只是为了解情况而提供的一个示例。显然,我最初不想让握手失败。感谢您的评论!
  • 我的意思是偶尔的 ERR_CONNECTION_RESET 可能不仅仅特定于 webSocket 连接。这可能只是您的网络服务器健康状况不佳的迹象。如果这是你的服务器,你的首要任务应该是让你的服务器健康,这样就不会发生这种情况,而不是尝试使用客户端代码来解决它。
  • 是的。这就是这个问题的产生方式。我们的服务器非常不稳定,因此初始握手失败了 10 次尝试。我们正在单独调查这些服务器问题,但这并不是这个问题/问题的一部分。无论如何感谢您的关注。

标签: socket.io


【解决方案1】:

Socket.io 然后正确地回退到轮询,但它似乎永远不会尝试再次切换回 websockets,即使它会工作。我的观察正确吗?

是的,正确。

如果是这样,你有什么建议?

我不认为尝试重新建立连接是库的工作。您可以设置自己的侦听器来检查服务器的可用性 - 有时服务器会崩溃并且用户不会注意到他们不再有连接...

我们在客户端的一些例子,希望它有助于挖掘。

    //If sockets close
    window.ws.onclose = function (e) {

        ws.onclose = null;
        ws.onerror = null;
        ws.onopen = null;
        // restart sockets in: 3000 ms 
        setTimeout(function () { ctx.createWS(); }, 3000); 
    };

    window.ws.onerror = function (error) {
        //On error we will try to restart sockets in function described before
        ws.close();
    };

【讨论】:

  • 好的。谢谢你。只是想确认我的工作是跟踪它。将尽快接受。
猜你喜欢
  • 2012-06-12
  • 2017-11-30
  • 1970-01-01
  • 1970-01-01
  • 2014-12-23
  • 2020-03-02
  • 1970-01-01
  • 1970-01-01
  • 2015-09-14
相关资源
最近更新 更多