Socket.io在触发断开连接事件之前需要很长时间

时间:2013-01-05 05:11:47

标签: javascript node.js heroku socket.io

我正在使用node.js和socket.io

进行HTML5游戏

我决定将其托管在Heroku

Heroku不允许使用WebSockets,所以我必须设置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的错误配置吗?

感谢。

2 个答案:

答案 0 :(得分:1)

它说here您可以配置心跳。要正确配置它,您必须在服务器和客户端调整心跳(给定here)。

尝试降低心跳。它可以解决您的问题。 另外,appfog似乎支持websockets。

答案 1 :(得分:0)

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

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);
    });
});