根据socket.io的示例:
要进行广播,只需将broadcast标志添加到
emit
和send
方法调用中。广播意味着将消息发送给除了发起它的套接字以外的所有人。
var io = require('socket.io').listen(80);
io.sockets.on('connection', function (socket) {
socket.broadcast.emit('user connected');
});
我尝试将此与新的socket.io命名空间功能结合起来,因此我得到了这个:
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);
});
});
然后我遇到了一个异常:'Cannot call method 'send' of undefined.' 那么,我认为广播是单个套接字的功能(尽管感觉有点奇怪——一个单独的套接字如何向所有其他套接字广播...)。 所以我尝试了:
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.socket.broadcast
吗? - Raynos