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

Posted

技术标签:

【中文标题】使用 socket.io v1.3.x 将单个用户的请求发送给一组预定义的用户【英文标题】:Use socket.io v1.3.x to send request from a single user to a set of predefined users 【发布时间】:2016-02-03 09:47:45 【问题描述】:

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

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

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

Socket.io +1.0 提供了命名空间和创建房间的功能,我认为可以通过创建房间来实现上述功能。但我无法将利用房间来满足这种需求的概念包装在我的脑海中。

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

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

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

这个系统是否可以通过房间实现,或者有其他方法吗?

【问题讨论】:

【参考方案1】:

我建议一个不同的解决方案: 当用户连接有这样的事情:

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;
);

【讨论】:

以上是关于使用 socket.io v1.3.x 将单个用户的请求发送给一组预定义的用户的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Context API 将单个 Socket IO 实例传递给页面?

node.js + socket.io:拍卖网站开发

socket.io:如何处理 4000 个用户?

使用 Redis 和 Socket.io 进行用户认证

socket.io 只向房间 A 和 B 中的用户广播

反应的socket.io聊天问题