使用socket.io v1.3.x将请求从单个用户发送到一组预定义用户

时间:2015-11-03 09:41:49

标签: ios node.js sockets express socket.io

这是我想用最新版本的Socket.io实现的,即1.3.7

登录的成员用户可以向一组预定义的管理员用户广播相同的信息。并且单个管理员用户可以从特定的一组成员用户接收响应。全部都是实时的。

例如,来自纽约的用户只想向那些来自纽约的管理员发送实时请求。在管理员面板上,来自纽约的管理员只会收到纽约用户的请求。并且该用户不知道纽约的另一个用户连接到同一个房间。

Socket.io +1.0提供了命名空间和创建房间的功能,我认为所提到的功能可以通过创建房间来实现。但是,我的问题在于围绕着利用房间的概念来解决这个问题。

到目前为止,我已经猜到,需要通过当地名称动态创建一个房间,即纽约;

var room = 'new york' // string coming from client
socket.join(room);

纽约用户和管理员都会连接到房间。但是,问题是管理员只能看到用户的请求,而不是其他管理员的请求,就像用户无法查看来自纽约的其他用户的请求一样。

这个系统是否可以使用房间实现,还是有其他办法吗?

1 个答案:

答案 0 :(得分:0)

我建议采用不同的解决方案: 当用户连接时,会出现以下情况:

io.on('connection', function(socket){ ...

在该代码之前创建数组变量以存储具有附加数据的所有套接字:

var connectionList = [];
io.on('connection', function(socket){
  var connection = {
    socket:socket,
    city: userCity,
    role: userRole
    ...
  }
  connectionList.push(connection);
}

现在,当您想要发送消息时,您可以遍历所有套接字并仅发送到满足特定条件的那些套接字,例如当用户发送请求时:

socket.on('somerequest', function(data){
  if(<some validation rules for data>){
    connectionList.forEach(function(otherConnection){
      if(<some conditions to send message>){
        otherConnection.socket.emit('message', somedata);
      }
    });
  }
});

这为您提供了巨大的配置可能性。

但请记住从列表中删除已关闭的连接! 像这样:

socket.on('disconnect', function(){
  var i = connectionList.indexOf(connection);
  delete connectionList[i];
  connection = null;
});