【问题标题】:Socket.io takes a long time before triggering the disconnect eventSocket.io 在触发断开事件之前需要很长时间
【发布时间】:2012-12-19 13:58:22
【问题描述】:

我正在使用 node.js 和 socket.io 做一个 HTML5 游戏

我决定将它托管在Heroku

Heroku 不允许使用 WebSocket,所以我必须设置 xhr-polling。 (Socket-io on Heroku)

io.configure( function() {
    io.set( "transports", ["xhr-polling"] );
    io.set( "polling duration", 10 );
} );

以前,我只使用网络套接字

io.set( "transports", ["websocket"] );

现在,当客户端断开连接(关闭窗口或刷新页面)时,“断开连接”事件不会立即在服务器上触发(看起来它正在等待客户端心跳超时)。

client.on( "disconnect", onClientDisconnect );

如果客户端重新加载,我会在 触发断开连接之前收到多个连接事件。 我的问题就在这里。

您有什么想法,为什么 xhr-polling 不会触发断开事件? 这是socket.io的错误配置吗?

谢谢。

【问题讨论】:

  • 没有办法知道使用 xhr-polling 的客户端是否断开连接,直到他们没有响应心跳,因为它不使用持久连接。

标签: javascript node.js heroku socket.io


【解决方案1】:

只需配置会话身份验证,您就可以随时了解客户端连接的内容。例如

io.set('authorization', function(handshakeData, ack) {
    var cookies = require(...);
    var signedCookies = parseCookies(cookies, secret);
    sessionStore.get(signedCookies['connect.sid'], function(err, sessionData) {
        handshakeData.session = sessionData || {};
        handshakeData.sid = signedCookies['connect.sid'] || null;
        ack(err, err ? false : true);
    });
});

【讨论】:

    【解决方案2】:

    上面写着here 你可以配置心跳。要正确配置它,您必须在服务器端和客户端调整心跳(给出here)。

    尝试降低心跳。它可能会解决您的问题。 另一方面,appfog 似乎支持 websockets。

    【讨论】:

    • 好的,我会尽量降低心跳以减少我的问题。 Appfog 看起来也很酷,可以解决我的问题,但出于个人原因,我想使用 Heroku。谢谢。
    猜你喜欢
    • 2016-02-24
    • 2012-09-29
    • 2020-03-10
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-08
    • 2013-04-03
    相关资源
    最近更新 更多