Socket.io:发出消息是否将所有数据发送到所有客户端?

时间:2014-04-14 17:31:08

标签: javascript node.js socket.io

问题是为了解 socket.io 的工作原理。

如果我的服务器具有多个客户端并具有以下功能(伪代码):

// Server-side
socket.emit('data-request', { some large object });

服务器是将大型数据对象发送给每个客户端还是仅发送给具有相应(功能/事件)的客户端?

socket.on('data-request', function(data){blah blah blah});

3 个答案:

答案 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:忽略我的示例代码。它没有用。