使用Socket.io更新所有客户端?

Jac*_*ack 74 javascript node.js socket.io

是否可以使用socket.io强制所有客户端更新?我尝试了以下内容,但在新客户端连接时似乎没有更新其他客户端:

Serverside JavaScript:

我正在尝试向所有客户端发送一条消息,其中包含当前连接的用户数,它正确地发送了大量用户....但是,在刷新页面之前,客户端本身似乎没有更新.我希望这发生是实时的.

var clients = 0;
io.sockets.on('connection', function (socket) {
  ++clients;
  socket.emit('users_count', clients);    
  socket.on('disconnect', function () {
    --clients;
  });
});
Run Code Online (Sandbox Code Playgroud)

客户端JavaScript:

var socket = io.connect('http://localhost');

socket.on('connect', function(){
  socket.on('users_count', function(data){
    $('#client_count').text(data);
    console.log("Connection");
  });
});
Run Code Online (Sandbox Code Playgroud)

Mat*_*att 178

它实际上并没有向其他客户端发送更新,而只是向刚刚连接的客户端发送更新(这就是您第一次加载时看到更新的原因)

// socket is the *current* socket of the client that just connected
socket.emit('users_count', clients); 
Run Code Online (Sandbox Code Playgroud)

相反,您想要发射到所有套接字

io.sockets.emit('users_count', clients);
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用广播功能,该功能向除了启动它的套接字之外的所有人发送消息:

socket.broadcast.emit('users_count', clients);
Run Code Online (Sandbox Code Playgroud)

  • @Jack根据文档,"广播意味着向除了启动它的套接字之外的所有人发送消息.",我希望对方将其发送给所有人. (3认同)
  • @Matt使用最新的Socket.IO API,io.sockets.emit不起作用,请使用io.emit. (2认同)

hou*_*han 13

我发现,使用socket.broadcast.emit()将只播放当前的"连接",但io.sockets.emit将广播到所有的客户.这里服务器正在监听"两个连接",这两个连接是完全2个套接字命名空间

io.of('/namespace').on('connection', function(){
    socket.broadcast.emit("hello");
});
io.of('/other namespace').on('connection',function(){/*...*/});
Run Code Online (Sandbox Code Playgroud)

我已经尝试使用io.sockets.emit()在一个命名空间,但它是由客户在其他命名空间接收.但是socket.broadcast.emit()只会广播当前的套接字命名空间.