【问题标题】:Socket.io doesn't send disconnect event to NodeJS in IE8/9Socket.io 不会在 IE8/9 中向 NodeJS 发送断开连接事件
【发布时间】:2014-04-10 12:39:59
【问题描述】:

我将 NodeJS 与 socket.io 一起用于我的聊天应用程序。当客户端刷新/关闭窗口或导航到不同的 URL 时,我需要客户端向 NodeJS 服务器发出“断开连接”事件。 IE8/9 的所有功能都很好。当刷新发生时,“断开连接”事件不会发送到服务器,因此服务器不知道这个特定的客户端不再连接。

我设法使用:

window.onbeforeunload = function(e) {
  socket.disconnect();
};

这会负责单击后退/前进按钮,然后通知服务器有关客户端断开连接。但是,刷新页面或关闭选项卡不会向服务器发送断开连接。似乎刷新页面太快了,所以socket.disconnect() 没有执行的机会。好像我像下面这样发出警报,客户端暂停警报窗口,服务器收到断开消息。

window.onbeforeunload = function(e) {
  socket.disconnect();
alert("hey watchout!");
};

现在,有什么方法可以让 IE8/9 在页面刷新时向 NodeJS 发送断开连接事件?

【问题讨论】:

    标签: node.js socket.io


    【解决方案1】:

    你可以来回发送信息,找到上次回复的时间,和现在比较,如果相差大于一个数字,断开客户端,当客户端再次开始发送时重新连接。

    你可以使用类似的东西:

    在客户端:

    socket.on('ping',function(){socket.emit('pong',(new Date()).getTime());});
    

    在服务器上:

    socketReferences = new Array();
    io.on('connection',function(socket){
        socketReferences.push(socket);
        socket.on('pong',function(data){
            if(new Date()).getTime()>5000){
                // disconnect code here
            }
        });
    });
    
    setInterval(function(){
        for(socket in socketReferences)
            socketReferences[socket].emit('ping','');
    },700);
    

    【讨论】:

      猜你喜欢
      • 2018-12-06
      • 2014-09-28
      • 2014-03-08
      • 2019-05-01
      • 2014-01-08
      • 2011-11-03
      • 1970-01-01
      • 2013-08-01
      • 1970-01-01
      相关资源
      最近更新 更多