我有一个非常简单的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 如何检测到它已关闭?
答案 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);