使用XHR轮询关闭套接字连接

时间:2012-10-21 18:35:41

标签: javascript node.js sockets

有人知道为什么我的套接字连接在使用xhr-polling时没有关闭?这是我想要执行的服务器代码,但在使用xhr-polling时不会触发。套接字连接工作正常(我在带有stunnel的清漆后面运行,因为这是一个安全的套接字)。我尝试在浏览器卸载时手动发出断开连接事件,但这对我来说不是最佳解决方案。

client.on('disconnect', function () {

    delete connected_clients[id];
    console.log('   debug - ' + 'client ' + client.id + 'is disconnected');
    console.log('   debug - ' + 'total number of connected clients is ' + Object.keys(connected_clients).length);               

});

在我的客户端代码中,我正在连接套接字:

socket = io.connect(BASE_URL, {
    "sync disconnect on unload":true
});

我的服务器端设置如下:

    io.enable('browser client minification');  // send minified client
    io.enable('browser client etag');          // apply etag caching logic based on version number
    io.enable('browser client gzip');          // gzip the file
    io.set('log level', 3);                    // reduce logging
    io.set('match origin protocol', true);     // ssl support
    io.set('sync disconnect on unload', true);
    io.set('transports', [                     // enable all transports (optional if you want flashsocket)
        'xhr-polling',
        'websocket',
        'flashsocket',
        'htmlfile',
        'jsonp-polling'
    ]);  

这是我在客户端退出浏览器时获得的调试消息

debug: xhr-polling closed due to exceeded duration

我正在使用带有节点0.8.8的socket.io版本0.9.10。

1 个答案:

答案 0 :(得分:0)

由于您(服务器)和客户端(浏览器)之间存在连接,因此在接收连接关闭时通知浏览器。如果浏览器没有通知您认为连接已关闭,则无法通知您。

我建议您对客户端进行编程,使其能够很好地处理您的服务器,并在适当地丢弃连接时通知它。如果在没有通知的情况下忽略连接,您只需在一段不活动时间(超时)后关闭连接。

将其想象为您即时通讯朋友的情景。您的朋友可能会很友好地通知您他们正在离开他们的办公桌并且不再能够参加对话(断开连接),或者他们也可以在没有通知的情况下离开他们的办公桌(杀死浏览器进程),或者更糟糕的是,他们可以心脏病发作会使他们无法参加(停电)。一段时间后,您将了解到他们不再积极参与会话(超时)。

对不起,这里没有魔法。您必须对服务器进行编程,以处理它可能与断开连接的客户端进行通信的事实。