检测客户端断开连接

时间:2014-03-11 03:17:06

标签: javascript node.js socket.io

我有一个非常简单的socket.io连接。我的服务器执行以下操作:

io.sockets.on("connection", function (socket) {
    console.log("CONNECTED ON SERVER");                                 
    socket.emit("connected", "CONNECTED!");                                     
});

确实,客户获得了“连接!”消息。

我需要能够检测客户端何时断开连接并执行某些操作。我试过了:

io.sockets.on("disconnect", function (socket) {                                 
    console.log("DISCONNECTED!");                                 
});

...但是这不会记录“DISCONNECTED!”在服务器上。但是,上方的CONNECTED ON SERVER被记录。

我知道套接字可以检测到断开连接,因为一旦我关闭浏览器窗口,服务器就会注销:

  

info - 传输端(套接字端)
    debug - 设置客户端的关闭超时
    debug - 清除客户端的关闭超时
    debug - 清除客户端的心跳间隔
    调试 - 丢弃传输

这意味着socket.io 能够检测到客户端连接已关闭。 I 如何检测到它已关闭?

1 个答案:

答案 0 :(得分:2)

您必须在每个套接字上设置事件

您可以在how to use page上看到他们在实际套接字上设置了disconnect事件:

// note, io.listen(<port>) will create a http server for you
var io = require('socket.io').listen(80);

io.sockets.on('connection', function (socket) {
  io.sockets.emit('this', { will: 'be received by everyone'});

  socket.on('private message', function (from, msg) {
    console.log('I received a private message by ', from, ' saying ', msg);
  });

  socket.on('disconnect', function () {
    io.sockets.emit('user disconnected');
  });
});

如果你查看socket.io代码(至少是v0.10.20),你会看到io.sockets是一个SocketNamespace对象(来自namespace.js),其中就是{{1功能

连接数据包

handlePacket

将事件发送到自己的EventEmitter。

断开数据包以这种方式完成:

self.$emit('connection', socket);

因此,永远不会为命名空间对象触发disconnect事件。

当前的github代码显示他们已将数据包处理移至各自的类

connection emission in namespace.js Line 172

socket.$emit('disconnect', packet.reason || 'packet');

disconnect emission in socket.js Line 370

// fire user-set events
self.emit('connect', socket);
self.emit('connection', socket);