socket.io – 如何在命名空间上广播消息?

根据socket.io的例子:

要进行广播,只需添加一个broadcast标志来sendsend方法调用。 广播意味着将消息发送给除了启动它的套接字以外的其他人。

 var io = require('socket.io').listen(80); io.sockets.on('connection', function (socket) { socket.broadcast.emit('user connected'); }); 

我试图把这个与新的socket.io namsepacefunction,所以我得到这个:

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

并得到一个例外:'不能调用方法'发送未定义'。 好吧,所以我想,广播是一个单一的套接字的function(它感觉有点奇怪 – 如何一个套接字可以brodacast所有其他…)。 所以我试了一下:

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

那么只有原始的发送者才能得到这个消息,这又是非常合乎逻辑的 – 我使用了与客户端相关的套接字的“发送”。

所以问题是:什么是使用广播function的正确方法?

也许socket.io的开发人员犯了一个错误,并将广播function添加到错误的对象(据我所知,它应该是命名空间的function,但现在它只为套接字定义)?

似乎我打开了一个赏金后,为自己解决了这个问题。 对于那个很抱歉。

无论如何,看看这是否有帮助:

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

但是,如果您不将其重新发送给发件人,则可以节省一些带宽并为用户创造更为快捷的体验。 只需将他们的消息直接添加到聊天logging中,并且可以select使用仅自我发送来确认接收没有问题。

如果您正在一个平衡的环境中工作,那么您的解决scheme就能正常工作,客户端的消息会触发所有其他消息的响应,但如果您希望服务器向所有客户端发送消息,则不会。

你可以使用io.sockets.emit来做到这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在命名空间中向每个人广播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 Multiroom聊天教程