【问题标题】:Node.js & Socket.IO - Rooms issueNode.js 和 Socket.IO - 房间问题
【发布时间】:2012-12-08 15:43:00
【问题描述】:

考虑一个多聊天应用程序。 用户可以加入多个房间(socket.join(room)),用户可以离开一个房间(socket.leave(room))。

当套接字离开房间时,我会通知其他房间参与者。如果套接字当前在 3 个房间中,并且他突然断开与网站的连接而没有以正确的方式离开房间,我该如何通知这些房间用户已经离开?

如果我使用 on socket disconnect 事件,用户此时将不再在任何房间。是保留一组单独的用户的唯一方法,还是有一些我没有想到的聪明方法?

【问题讨论】:

  • 嗯,根据 socketio,无论我做什么,房间里总是有 2 个用户

标签: javascript node.js socket.io


【解决方案1】:

在断开连接事件期间,您的进程仍然可以使用套接字。例如,这应该可以工作

io.socket.on('connection', function(socket){
    socket.on('disconnect', function() {
       // this returns a list of all rooms this user is in
       var rooms = io.sockets.manager.roomClients[socket.id];
       for(var room in rooms) {
           socket.leave(room);
       }
    });
});

虽然这实际上不是必需的,因为 socket.io 会在断开连接事件时自动修剪 rooms。但是,如果您希望执行特定操作,则可以使用此方法。

【讨论】:

  • 在客户端浏览器中使用 window.onbeforeunload 怎么样?你认为它会不稳定吗?
  • 你可以这样做,但我认为这没什么意义。您试图提醒给定房间中的其他用户此人已离开。特定客户端的视图对其他任何用户都没有影响,因此您可以做的唯一有用的事情是触发一些套接字事件,然后告诉所有其他用户他们离开了。最好将其保留在服务器上并使用断开连接事件。
  • 我不太明白你回答的第一部分......如果房间是动态创建的呢?我必须为每个人创建一个 io.of(./room1).on 吗?
  • 我的第一个答案是关闭。除非您将房间视为名称空间,否则您不会想做io.of(./room1).on(...)。相反,您可以在断开连接事件上调用socket.leave(room),但documentation 指出这将自动发生。
【解决方案2】:

我假设套接字是您的节点进程中的一个长期存在的对象。如果是这种情况,那么当用户连接时,您可以轻松地在套接字对象上添加对用户的引用。当您获得套接字断开连接时,您无需查找与会话关联的用户,因为它会在那里。

连接或登录时:

socket.user = yourUser;

断开连接时:

socket.on('disconnect', function(){
  socket.leave(room, socket.user);
}

请参阅此处,了解向套接字对象和单个房间聊天客户端添加属性的示例:

http://psitsmike.com/2011/09/node-js-and-socket-io-chat-tutorial/

【讨论】:

  • 一个socket就是一个socket.io session...仅此而已(socket.id)
猜你喜欢
  • 2013-10-10
  • 1970-01-01
  • 1970-01-01
  • 2017-10-20
  • 2014-07-29
  • 1970-01-01
  • 2021-03-02
  • 2023-03-27
  • 1970-01-01
相关资源
最近更新 更多