【问题标题】:How to broadcast message to clients of the certain namespace in Socket.IO?如何在 Socket.IO 中向特定命名空间的客户端广播消息?
【发布时间】:2012-02-13 02:17:31
【问题描述】:

这是来自 socket.io 网站的示例:

var io = require('socket.io').listen(80);

var chat = io
  .of('/chat')
  .on('connection', function (socket) {
    socket.emit('a message', {
        that: 'only'
      , '/chat': 'will get'
    });
    chat.emit('a message', {
        everyone: 'in'
      , '/chat': 'will get'
    });
  });

var news = io
  .of('/news')
  .on('connection', function (socket) {
    socket.emit('item', { news: 'item' });
  });

通常我使用 io.sockets.emit(...) 向客户端广播数据。但是如何向与命名空间连接的客户端广播消息?换句话说,如何将消息发送给所有订阅新闻的客户,而不是那些订阅聊天的客户?

更新: 我想我知道答案了:

news.sockets.emit(...);

我说的对吗?

【问题讨论】:

  • 是的,你是对的。顺便说一句,您可以根据FAQ 发布自己问题的答案并接受它们,这样您的问题就不会一直无人回答。

标签: node.js socket.io


【解决方案1】:

来自官方example on github

var io = require('socket.io').listen(80);

io.sockets.on('connection', function (socket) {
  socket.join('justin bieber fans');
  socket.broadcast.to('justin bieber fans').emit('new fan');
  io.sockets.in('rammstein fans').emit('new non-fan');
});

因此,如果您想向命名空间中的所有连接客户端发送消息,您可以使用io.sockets.in('namespace').emit('message')

【讨论】:

  • 您的示例有效,但 github 上的示例并未说明客户端如何区分来自不同渠道的消息。 Q 中的方法确实允许这样做。
  • 好的,我需要在一个套接字连接上有两个不同的流。所以从客户端我调用 io.connect('IP:PORT/NAMESPACE') 而在服务器端我需要为每个命名空间分别发送消息。
  • 那么在您的示例中,我如何知道要加入套接字的哪个命名空间?
  • 在页面底部结帐socket.io/#how-to-use,“将自己限制在命名空间”之后的示例。
  • @alessioalex 使用 joinin 你在谈论 rooms 而不是 namesapces: github.com/LearnBoost/socket.io/wiki/Rooms
【解决方案2】:

您可以尝试使用以下方法:

io.of('/news').emit('data', data);

在我的情况下它可以工作(版本"socket.io":"^1.0.0-pre2")。

【讨论】:

    猜你喜欢
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    • 2015-08-06
    • 2021-03-15
    • 1970-01-01
    • 2018-06-26
    相关资源
    最近更新 更多