【问题标题】:How to send message to room clients when a client disconnects客户端断开连接时如何向房间客户端发送消息
【发布时间】:2012-12-03 12:45:24
【问题描述】:

我希望服务器在其中一个断开连接时向所有房间客户端发送消息。

类似这样的:

socket.on('disconnect', function() {
    server.sockets.in(room).emit('bye');
});

但是……

  • 我如何知道要广播哪个房间?
  • 如果客户加入了多个房间怎么办?

【问题讨论】:

    标签: javascript node.js socket.io


    【解决方案1】:

    在检查了套接字对象之后,我想出了这个解决方案:

    socket.on('disconnect', function() {
        var rooms = io.sockets.manager.roomClients[socket.id];
        for (var room in rooms) {
            if (room.length > 0) { // if not the global room ''
                room = room.substr(1); // remove leading '/'
                console.log('user exits: '+room);
                server.sockets.in(room).emit('bye');
            }
        }
    });
    

    【讨论】:

    • 但是从这个解决方案看来,您将在用户连接的每个房间发出“再见”,而不仅仅是他们离开的房间?
    • 当用户断开连接时,它会离开所有频道。所以它会向所有加入的频道发出再见。
    • 假设我在浏览器的三个选项卡中加入了 3 个不同的房间,然后我关闭了选项卡 3。我不应该在房间 1 和 2 中看到再见消息。每个选项卡都有自己的套接字 ID .
    • 在我的实现中,每个选项卡都像是一个不同的用户(从节点的角度来看)。
    【解决方案2】:

    这不是 100% - 但试一试:

    在连接到房间或添加新用户时,请记住他们的用户名或 ID 或套接字中的其他内容:

    socket.on('adduser', function(username){
        socket.username = username;
        socket.join('room');
    }
    

    然后收听房间上的离开事件:

    socket.room.on('leave', function(){
        socket.broadcast.to(this).emit(socket.username + ' says seeya!');
    }
    

    无论如何都值得一试 - 我敢肯定,如果不这样做,类似的东西会起作用。

    【讨论】:

    • 不,socket.room 未定义。
    • 你说得对 - 毕竟这行不通 - 你只需要添加一个订阅/取消订阅功能 - 看看这个聊天示例,房间里显示在一个房间里 - 它基本上可以你需要做什么。 udidu.blogspot.ca/2012/11/…
    • 谢谢,但是在您发布的示例中,我想要在 server.js 的函数 disconnect() 中完成,该函数与此处接受的答案具有相同的代码,这不是理想的方式(对于我),因为您必须手动找到用户要离开的房间。
    猜你喜欢
    • 2014-09-18
    • 1970-01-01
    • 2015-08-06
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-04
    相关资源
    最近更新 更多