【问题标题】:Closing socket connection with XHR-polling使用 XHR 轮询关闭套接字连接
【发布时间】:2012-10-11 15:20:55
【问题描述】:

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

【问题讨论】:

    标签: javascript node.js sockets


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-22
      • 2014-12-13
      • 1970-01-01
      • 2012-06-12
      • 1970-01-01
      • 2020-08-06
      相关资源
      最近更新 更多