3

有谁知道为什么我的套接字连接在使用 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。

4

1 回答 1

0

由于连接是在您(服务器)和客户端(浏览器)之间,因此您可以在连接关闭时收到通知。如果浏览器没有通知您它认为连接已关闭,那么您将无法获知它。

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

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

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

于 2013-11-04T10:20:20.577 回答