Socket.IO - 如何为不同的端点/房间获取不同的活动用户列表?

时间:2015-10-05 19:43:10

标签: node.js sockets socket.io

我正在编写一个基于socket.io(v1.3.6)的简单聊天程序。当用户使用他们的用户名登录时,他们可以在仪表板中看到几个聊天室,并通过不同的端口输入每个聊天室,即

.st-content

用户可以在其中任何一个房间聊天。对于每个房间,我想创建一个活动的用户列表。 '有源'表示此用户现在已连接到套接字(在此房间聊天)。

我看到很多问题已经发布,但仍然被他们几个孤立的单词弄糊涂了。

在我当前的server.js中,我添加了以下代码:

http://localhost:8080/api/chats/room01

总结一下,有两个问题:

  • 如何区分不同房间/端点的套接字连接?

  • 如何为同一用户获取有效的用户名而不是var io = require('socket.io')(http); io.on('connection', function(socket){ console.log('a user connected: ' + socket.id); socket.on('disconnect', function(){ console.log(socket.id + ' has disconnected from the chat.'); }); });

非常感谢。

更新

我的服务器端代码:

socket.id

我的客户端代码:

io.of('/rooms/room01').on('connection', function(socket) {

  console.log("socket connected: ", socket.id);
  //....some more codes

});

上述代码不起作用。但以前当我使用默认命名空间

app.factory('socketio', ['$rootScope', function($rootScope) {
  'use strict';

  var socket = io.connect('http://localhost:8080/rooms/room01');
  return {

    on: function(eventName, callback) {
      socket.on(eventName, function() {
        var args = arguments;
        $rootScope.$apply(function() {
          callback.apply(socket, args);
        });
      });
    },

    emit: function(eventName, data, callback) {
      socket.emit(eventName, data, function() {
        var args = arguments;
        $rootScope.$apply(function() {
          if (callback) {
            callback.apply(socket, args);
          }
        });
      });
    }
  };
}]);

io.of('/').on('connection', function(socket) {
  //...
}

效果很好。你能告诉我为什么吗?

1 个答案:

答案 0 :(得分:3)

  

如何区分不同的套接字连接   房间/端点?

在您的服务器上,有几种方法可以列出每个房间的各种房间和插座。这里有一些关于您可以在服务器上访问的各种数据的信息,然后您可以决定哪种方法可以获得您想要的效果:

io.sockets.adapter.rooms

这是一个包含所有房间的对象,当前至少有一个连接。这包含服务器名为.join()的两个房间,用于手动将套接字连接到房间,并包含每个套接字自动连接到的每个默认房间(带有socket.id的名称)。因此,如果您知道某个房间的名称为"test",那么您可以将每个房间的对象作为io.sockets.adapter.rooms['test']的密钥。

io.sockets.connected

这是一个对象,包含当前连接的每个套接字,其中socket.id是对象中的键。因此,如果id为vlPYz3EHUOe8vFitAAAJ,那么您可以将该id的套接字对象作为io.sockets.connected['vlPYz3EHUOe8vFitAAAJ']来访问。显然,您可以使用for (var sock in io.sockets.connected)类型的循环迭代所有连接的套接字。然后,在该套接字对象中,您可以看到它所在的房间:io.sockets.connected['vlPYz3EHUOe8vFitAAAJ'].rooms这是一个房间名称数组。这个房间名称数组将包含与{同名的自动房间{1}}。

socket.id

这是一组连接的套接字,可能比使用io.sockets.sockets更容易访问所有当前连接的套接字。与上一节中描述的一样,一旦有了给定的连接套接字,就可以访问io.sockets.connected属性来获取套接字当前所在的房间数组。

对于特定套接字,您可以通过以下方式获取房间列表:

socket.rooms

这是给定套接字当前所在房间名称的数组。这包括与socket.rooms 同名的自动房间名称,因此如果只是尝试列出,您可能要忽略该房间名称插座所在的普通房间。

  

如何获取活动的usenames而不是socket.id   对于同一个用户有什么不同?

由于用户名是您分配的并且与socket.io无关,因此您必须找到一种方法将用户名与套接字自己关联。根据用户名的知晓位置,您可以在不同的地方执行此操作。如果它已经存在于cookie中,那么您可以从以下位置获取它:socket.id这是在最初连接套接字时为此特定套接字设置的cookie的快照。

如果在最初连接套接字时以其他方式知道用户名,则可以从其他机制获取用户名并将其另存为套接字对象的属性:socket.handshake.headers.cookie然后您可以访问它可以随时从服务器端套接字对象中获取。

这是我用来探索这些不同数据结构的一些服务器端诊断代码:

socket.username = 'xxx';