在客户端断开连接时释放事件处理程序 Socket.IO

Release event handlers on disconnection of Socket.IO client

本文关键字:事件处理 程序 Socket IO 释放 客户端 断开 连接      更新时间:2023-09-26

我正在使用 Socket.IO,如本示例所示:

io.sockets.on("connection", function (socket) {
    myService.on("myevent", function() {
        socket.emit("myevent", { /* ... */ });
        // some stuff happens here of course
    });
});

myService 是一个单例和 EventEmitter 的子类,它会随着时间的推移触发myevent。一切正常,但是我想在这种情况下我造成了某种泄漏。我的服务如何知道连接被销毁后它不需要调用处理程序?是否有某种破坏事件我可以捕获然后从myService中删除处理程序?

侦听套接字断开连接事件,并在收到断开连接事件时,从myService对象中删除相关的事件处理程序。

您应该能够像这样执行此操作:

io.sockets.on("connection", function (socket) {
    function handler() {
        socket.emit("myevent", { /* ... */ });
        // some stuff happens here of course
    }
    myService.on("myevent", handler);
    socket.on("disconnect", function() {
        myService.removeListener("myevent", handler);
    });
});

如果您尝试做的是广播到所有连接的套接字,您可以只安装一个"myevent"侦听器(不是每个连接一个(,并使用io.emit()广播到所有套接字,而不必为此目的处理连接或断开连接事件。

如果您计划在触发其他事件时将数据发送到所有套接字,则无需在每次客户端连接/断开连接时添加/删除其他侦听器。

使用

io.sockets(默认情况下是对默认命名空间及其上所有客户端的引用(将 socket.io 事件简单地触发到现在连接的所有套接字会更有效、更容易,io.sockets.emit

myService.on('myevent', () => {
  io.sockets.emit('myevent', {/*...*/});
});

如果只需要向某些用户子集触发此事件,请尝试使用特定的命名空间或聊天室:

myService.on('myevent', () => {
  //with namespaces
  io.of('namespace').emit('myevent', {/*...*/});
  //with rooms
  io.to('room').emit('myevent', {/*...*/});
});