【问题标题】:socket.io client getting connected disconnected repeatedlysocket.io 客户端不断连接断开连接
【发布时间】:2017-07-17 16:01:33
【问题描述】:

如果有多个 socket.io 服务器(ALB 平衡),客户端正在与两个节点连接和断开连接,从而给出“传输错误”。理想情况下,它应该连接到一个节点并保持连接到该节点。如果 ALB 中有一个节点,则连接保持持久。有什么帮助吗??

【问题讨论】:

    标签: android node.js sockets socket.io


    【解决方案1】:

    默认情况下,socket.io 首次启动时,会以 http 轮询模式启动。经过几次连续的 http 请求,并在两端的能力检查正常后,它将切换到 webSocket 模式。这样做是为了首先建立一个工作连接,然后确定两端是否支持 webSocket,如果支持,则切换到使用 webSocket。如果您有一个非粘性负载均衡器,那么您确实可能会遇到前几个 http 轮询请求最终在不同服务器上的问题,这可能会破坏 socket.io 的工作方式,因为单个服务器会丢失一些连接启动顺序。

    您可以将负载均衡器配置为粘性,以便它们始终将相同的客户端发送到同一台服务器,或者您可以告诉 socket.io 您只希望它以 webSocket 模式连接。

    要将 socket.io 配置为仅使用 webSocket 而没有轮询(因此只有一个连接),您可以在客户端中设置一个配置选项,如下所示:

    Socket.io 1.x: use WebSockets only?

    请记住,socket.io 具有自动连接逻辑,因此如果在您建立与服务器的 socket.io 连接后的某个时间,连接由于某种原因停止工作,客户端将断开当前连接并尝试做一个新的。如果您仍在使用非粘性负载平衡器,那么重新连接可能会在不同的服务器上结束。取决于您在服务器上执行的操作,这可能是也可能不是问题。粘性负载平衡将确保重新连接在同一台服务器上结束。

    【讨论】:

    • 直接使用传输作为websocket而不是轮询的任何缺点?
    • @VikasGoyal - 如果您在不支持 webSockets 的浏览器中运行,那么您将无法获得连接。 socket.io 通常会通过用 http 轮询代替缺少的 webSocket 来处理这种情况。
    【解决方案2】:

    使用 0.8.3 版本的 io.socket 删除新版本 1.0.0

    compile('io.socket:socket.io-client:0.8.3') {
        exclude group: 'org.json', module: 'json'
    }
    

    这对我有用

    【讨论】:

      【解决方案3】:

      删除旧版本后使用以下版本的io.socket: https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.2.0/socket.io.js

      它对我有用!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-16
        • 2012-05-17
        • 1970-01-01
        • 1970-01-01
        • 2012-10-12
        • 2010-11-01
        相关资源
        最近更新 更多