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

新手上路,请多包涵

我正在尝试通过构建一组动态创建的聊天室来学习 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
        });
      })
  });

原文由 isdn 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.6k
2 个回答

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 发射备忘单

原文由 EMX 发布,翻译遵循 CC BY-SA 4.0 许可协议

这是一种工作方法。

我在服务器端使用 socketio "socket.io": "^2.3.0" 。在客户端是android

 // SocketIO
implementation('io.socket:socket.io-client:1.0.0') {
    // excluding org.json which is provided by Android
    exclude group: 'org.json', module: 'json'
}

以下是为我工作的代码。

 // Join Chat Room
socket.on('ic_join', function(data) {

    // Json Parse String To Access Child Elements
    let messageJson = JSON.parse(data)
    let room1 = messageJson.room1

    console.log('======Joined Room========== ')
    console.log(room1)

    socket.join(room1, function(err) {
        console.log(io.sockets.adapter.rooms[room1].length);
        console.log(err)
    })
})

// Leave Chat Room
socket.on('ic_leave', function(data) {

    // Json Parse String To Access Child Elements
    let messageJson = JSON.parse(data)
    let room1 = messageJson.room1

    console.log('======Left Room========== ')
    console.log(room1)

    socket.leave(room1, function(err) {
        if (typeof io.sockets.adapter.rooms[room1] !== 'undefined' && io.sockets.adapter.rooms[room1] != null) {
            console.log(io.sockets.adapter.rooms[room1].length);
            console.log(err)
        } else{
            console.log("room is deleted")
        }
    })
})

原文由 DragonFire 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题