gpt4 book ai didi

javascript - 检测客户端断开连接

转载 作者:行者123 更新时间:2023-12-02 17:39:49 25 4
gpt4 key购买 nike

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

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

事实上,客户端得到了“CONNECTED!”消息。

我需要能够检测客户端何时断开连接并采取一些操作。我试过:

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

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

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

info - transport end (socket end)
debug - set close timeout for client
debug - cleared close timeout for client
debug - cleared heartbeat interval for client
debug - discarding transport

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

最佳答案

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

你可以在他们的how to use page上看到他们在实际套接字上设置断开连接事件:

// 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),并且在其中是handlePacket函数

连接数据包确实

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

这会将事件发送到它自己的 EventEmitter 内容。

断开数据包是这样完成的:

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

因此,命名空间对象永远不会触发断开连接事件。

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

connection emission in namespace.js Line 172

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

disconnect emission in socket.js Line 370

 ...
this.disconnected = true;
delete this.nsp.connected[this.id];
this.emit('disconnect', reason);
};

关于javascript - 检测客户端断开连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22315759/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com