当前位置: 首页 > 面试题库 >

Socket.io:如何正确加入和离开房间

姜建德
2023-03-14
问题内容

我正在尝试通过构建一组动态创建的聊天室来学习Socket.io,这些聊天室在用户进入和离开时会发出“已连接”和“已断开”消息。看着问题,我已经把一些功能,但大多数链接的响应是从谁承认自己已成功侵入一起答案的人,我已经注意到有一个更普遍的-和最近-
有关的权利的方式来讨论在Socket.io存储库上执行此操作(尤其是在此处和此处)

因为我是个新手,所以我不知道下面的工作是否是可以接受的处理方式,或者它只是偶然地起作用,但会导致性能问题或导致过多的侦听器。如果有一种理想且正式的方式来加入和离开房间,感觉比以前那么笨拙,我很乐意对此进行了解。

客户

var roomId = ChatRoomData._id // comes from a factory


function init() {

    // Make sure the Socket is connected
    if (!Socket.socket) {
        Socket.connect();
    }

    // Sends roomId to server
    Socket.on('connect', function() {
        Socket.emit('room', roomId);
    });

    // Remove the event listener when the controller instance is destroyed
    $scope.$on('$destroy', function () {
        Socket.removeListener('connect');
    });

}

init();

服务器

  io.sockets.once('connection', function(socket){
    socket.on('room', function(room){     // take room variable from client side
      socket.join(room) // and join it

      io.sockets.in(room).emit('message', {      // Emits a status message to the connect room when a socket client is connected
        type: 'status',
        text: 'Is now connected',
        created: Date.now(),
        username: socket.request.user.username
      });

      socket.on('disconnect', function () {   // Emits a status message to the connected room when a socket client is disconnected
        io.sockets.in(room).emit({ 
          type: 'status',
          text: 'disconnected',
          created: Date.now(),
          username: socket.request.user.username
        });  
      })
  });

问题答案:

Socket.IO :最近发布的 v2.0.3

加入 一个房间一样简单socket.join('roomName'

//:JOIN:Client Supplied Room
socket.on('subscribe',function(room){  
  try{
    console.log('[socket]','join room :',room)
    socket.join(room);
    socket.to(room).emit('user joined', socket.id);
  }catch(e){
    console.log('[error]','join room :',e);
    socket.emit('error','couldnt perform requested action');
  }
})

离开 房间,就这么简单socket.leave('roomName');

//:LEAVE:Client Supplied Room
socket.on('unsubscribe',function(room){  
  try{
    console.log('[socket]','leave room :', room);
    socket.leave(room);
    socket.to(room).emit('user left', socket.id);
  }catch(e){
    console.log('[error]','leave room :', e);
    socket.emit('error','couldnt perform requested action');
  }
})

通知房间房间用户正在断开连接

断开连接事件时无法获取客户端当前所在的房间列表

已修复(添加“断开连接”事件以在断开连接时访问socket.rooms)

 socket.on('disconnect', function(){(
    /*
      socket.rooms is empty here 
      leaveAll() has already been called
    */
 });
 socket.on('disconnecting', function(){
   // socket.rooms should isn't empty here 
   var rooms = socket.rooms.slice();
   /*
     here you can iterate over the rooms and emit to each
     of those rooms where the disconnecting user was. 
   */
 });

现在发送到特定房间:

// sending to all clients in 'roomName' room except sender
  socket.to('roomName').emit('event', 'content');

Socket.IO发射备忘单



 类似资料:
  • 我使用的是socket.io/node.js/express。当我使用socket.join(“room”)加入socket.io房间时,它会注册该房间,但用户只加入“room”。 这个命令显示了所有的房间,它同时返回'room'和'',尽管我从未创建过'room: 任何帮助都将不胜感激,这是非常奇怪的行为:( 编辑:以下是相关的服务器代码

  • 我正在使用Node.js、mongodb、Socket.io和Express实现一个聊天服务器。我想知道的是是否有一个最大的限制。同时开放房间的socket.io多房间聊天。 另外,是否有一个最大的不。每个房间的用户。

  • 问题内容: 我正在尝试使用Socket.io v.7中的新“会议室”功能来创建动态聊天室,但是在我的示例中无法使静态会议室正常工作。用户根据URL选择应该以room1或room2结尾。用户在聊天室中输入的任何内容都应广播给同一房间的用户。我有2个浏览器(chrome和ff),每个浏览器都有一个打开到/ room1和/ room2的选项卡,但是我键入的内容似乎不会广播到其他选项卡。我究竟做错了什么?

  • 问题内容: 在解决如何创建socket.io多播组的问题上取得进展之后,我发现将房间作为完成我需要的工作的好方法。 但是,很高兴知道所有房间,而无需额外的数据结构。 是否可以从服务器套接字获取服务器上所有房间的列表? 问题答案: 简短的答案: 我分析了: 我得到以下输出: 从单个客户加入“ public-alfred”会议室后,其中包含:

  • 问题内容: 我想请你帮忙。我在socket.io的客户端上遇到了麻烦,我想在客户端调用此代码以在socket.io中创建一个房间: 我不知道这是否正确,如果不正确,请帮助我纠正这些家伙。我不是在节点js和套接字方面专业,但我已经阅读了他们的wiki。有没有可能创造空间的方法? 问题答案: 不需要创建Socket.IO中的房间,而是在套接字加入时创建一个房间。它们是在服务器端加入的,因此您必须指示服

  • 我有下面的方法,每隔几秒钟插入一大批记录。运行一段时间后,我得到如下错误: 错误:通信链接失败 从服务器成功接收的最后一个数据包是523毫秒前。上次成功发送到服务器的数据包是8毫秒前。 May 16, 2013 9:48:30 AM com.mchange.v2.c3p0.stmt.GooGooStatementCache checkinStatement INFO: 签入语句问题,丢弃。 com