socket.io-如何在名称空间上广播消息?

| 根据socket.io的示例:   要广播,只需在
emit
send
方法调用中添加
broadcast
标志。广播意味着将消息发送到其他人(除了启动该消息的套接字之外)。
var io = require(\'socket.io\').listen(80);

io.sockets.on(\'connection\', function (socket) {
  socket.broadcast.emit(\'user connected\');
});
我尝试将其与新的socket.io namsepace功能结合使用,因此得到了以下信息:
var chat = ioserver.of(\'/chat\');

chat.on(\'connection\', function (socket) {
      console.log(\'chat connection\');   
      socket.on(\'message\', function (msg) {
        console.log(msg);  
        chat.send(msg);
      });
  });
这可以正常工作,聊天通道中的每个人(而没有其他通道)都可以收到消息。但是发件人也可以得到它。 因此,我尝试执行以下操作:
chat.on(\'connection\', function (socket) {
      console.log(\'chat connection\');   
      socket.on(\'message\', function (msg) {
        console.log(msg);  
        chat.broadcast.send(msg);
      });
  });
并得到一个异常:\'无法调用未定义的方法'send \'。 好的,所以我认为,广播是单个套接字的功能(尽管感觉有点奇怪-单个套接字如何广播到所有其他套接字...)。  所以我尝试了:
chat.on(\'connection\', function (socket) {
      console.log(\'chat connection\');   
      socket.on(\'message\', function (msg) {
        console.log(msg);  
        socket.broadcast.send(msg);
      });
  });
但现在情况更糟了-没有人收到邮件,甚至没有发件人。无论如何,这是我逻辑上的预期-一个套接字无法通过自身广播某些内容。这次也没有例外,因此为套接字定义了广播。 如果我做:
chat.on(\'connection\', function (socket) {
      console.log(\'chat connection\');   
      socket.on(\'message\', function (msg) {
        console.log(msg);  
        socket.send(msg);
      });
  });
那么只有原始的发送者才能收到消息,这也很合逻辑-我使用了与客户端相关的套接字的\'send \'。 所以问题是:使用广播功能的正确方法是什么? 也许socket.io的开发人员犯了一个错误,并向错误的对象添加了广播功能(据我所知,它应该是名称空间的功能,但现在仅为套接字定义)?     
已邀请:
        似乎在获得赏金后,我能够为自己解决此问题。对于那个很抱歉。 无论如何,请查看是否有帮助:
chat.on(\'connection\', function (socket) {
  socket.on(\'message\', function (msg) {
    socket.emit(msg); // Send message to sender
    socket.broadcast.emit(msg); // Send message to everyone BUT sender
  });
});
但是,如果不将其重新发送给发件人,则可以节省一些带宽并为用户创建更生动的体验。只需将他们的消息直接添加到聊天日志中,并可以选择仅使用自发射来确认已收到消息而没有问题。     
        如果您在事件环境中工作,则解决方案将起作用,在该环境中,来自客户端的消息会触发对所有其他消息的响应,但如果您希望服务器将消息发送给所有客户端,则该解决方案不会起作用。 您可以使用
io.sockets.emit
进行此操作:
var io = require(\'socket.io\').listen(80);
io.sockets.emit(\'message\', { message: \"Hello everyone!\" });
但是,文档尚不清楚如何对特定名称空间执行此操作。
io.sockets
只是
io.of(\'\')
的快捷方式,因此您可以通过调用
io.of(\'/namespace\').emit
广播给命名空间中的每个人:
var io = require(\'socket.io\').listen(80);
io.of(\'/admins\').emit(\'message\', { message: \"Hello admins!\" });
    
        
var customNS = ioserver.of(\'/chat\'); 

customNS.on(\'connection\', function (socket) {
   socket.on(\'message\', function (msg) {

       // Send message to sender 
       socket.emit(msg);

       // Send message to everyone on customNS INCLUDING sender
       customNS.emit(msg);

       // Send message to everyone on customNS BUT sender
       socket.broadcast.emit(msg);

       // Send message to everyone on ROOM chanel of customNS INCLUDING sender
       customNS.in(\'ROOM\').emit(msg); 

       // Send message to everyone on ROOM chanel of customNS BUT sender
       socket.broadcast.in(\'ROOM\').emit(msg); 


   });
});
还检查此答案向发件人(Socket.io)以外的所有客户端发送响应     
        也许这会帮助某人
socket.broadcast.to(\'room1\').emit(\'updatechat\', \'SERVER\', username + \' has connected to this room\'); 
看到 Nodejs和Socketio多房间聊天教程     

要回复问题请先登录注册