问题是为了解 socket.io 的工作原理。
如果我的服务器具有多个客户端并具有以下功能(伪代码):
// Server-side
socket.emit('data-request', { some large object });
服务器是将大型数据对象发送给每个客户端还是仅发送给具有相应(功能/事件)的客户端?
socket.on('data-request', function(data){blah blah blah});
答案 0 :(得分:3)
不,你在那里做什么会向连接到服务器的每个插座发送一条消息,除了socket
的套接字,如果要广播到你会做一个特定的房间
io.sockets.in('some room name').broadcast('some data')
如果您希望向特定房间中的每个人广播,除非发件人在发件人在该房间内,您会这样做
socket.broadcast.to('some room name').emit('some data');
首先,你可能需要创建一些房间,在这种情况下你只需要做
someSocket.join('some room name')
也许这样的事情会帮助你。
io.sockets.on('connection', function (socket) {
// let everyone know i'm here
socket.broadcast.emit('user connected');
socket.on('join-data-request-room', function(){
socket.join('data-request-room')
})
});
现在你可以这样做
io.sockets.in('data-request-room').broadcast('new data')
它会发送给那个房间里的每个人,当前在那个房间里没有人,要在那个房间里添加人,你会在客户端上做这样的事情(浏览器)。
io.emit('join-data-request-room')
现在只有“客户”才能进入会议室data-request-room
我几个月没有使用 socket.io 所以可能有一些我不知道的更好的方法。
答案 1 :(得分:1)
该消息将仅发送给正在收听的套接字。套接字连接意味着您在服务器和客户端之间获得一对一的连接。
如果要向所有客户端(自己除外)广播相同的消息:
var io = require('socket.io').listen(80);
io.sockets.on('connection', function (socket) {
socket.broadcast.emit('user connected');
});
广播的调用方式与this类似,实施位于adapter module。
如果您需要更具体的消息发送,可以使用房间概念,请阅读有关rooms的更多信息。
答案 2 :(得分:1)
据我了解,服务器无法知道谁在听什么消息类型,但我不是100%肯定,我会继续寻找参考。与此同时,如果您只想发送给某些客户,则应使用rooms。
修改强>
这个简单的实验应该给出答案:
//Server-side
socket.emit('data-request', { a: 100 });
...
//Client-side
socket.on('message', function(data){console.log(data)});
收听所有消息。客户端应收到data-request
消息。
编辑2:忽略我的示例代码。它没有用。