【问题标题】:Update all clients using Socket.io?使用 Socket.io 更新所有客户端?
【发布时间】:2011-11-13 05:00:44
【问题描述】:

是否可以强制所有客户端使用 socket.io 进行更新?我尝试了以下方法,但是当新客户端连接时,它似乎没有更新其他客户端:

服务器端 JavaScript:

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

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

客户端 JavaScript:

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

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

【问题讨论】:

    标签: javascript node.js socket.io


    【解决方案1】:

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

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

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

    io.sockets.emit('users_count', clients);
    

    或者,您可以使用广播功能,它将消息发送给除了启动它的套接字之外的每个人:

    socket.broadcast.emit('users_count', clients);
    

    【讨论】:

    • 谢谢,使用广播和使用 io.sockets.emit 有什么不同吗?
    • @Jack 根据文档,“广播意味着向除启动它的套接字之外的所有人发送消息。”,正如我所期望的那样,其他人会将消息发送给所有人。跨度>
    • 看来我犯了一个错误,将对此答案的更正作为编辑提供。由于编辑被拒绝,这里又来了:socket.broadcast.emit 和 io.sockets.emit 不是彼此的替代品,因为它们有很大的区别。广播变体向所有套接字发射除了到触发套接字,而 io.sockets 方法真正发射到所有套接字。
    • io.sockets.emit可以在io.sockets.on('connection', function (s){...的范围之外使用吗?
    • @Matt 使用最新的 Socket.IO API,io.sockets.emit 不起作用,请改用 io.emit。
    【解决方案2】:

    我发现使用socket.broadcast.emit()只会广播到当前的“连接”,但是io.sockets.emit 将向所有客户端广播。 这里服务器正在侦听“两个连接”,这正是 2 个套接字 namespaces

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

    我曾尝试在一个命名空间中使用 io.sockets.emit(),但客户端在另一个命名空间中收到了它。但是 socket.broadcast.emit() 只会广播当前的套接字命名空间。

    【讨论】:

      【解决方案3】:

      从 socket.io 0.9 版开始,“emit”不再对我有用,我一直在使用“send”

      这就是我正在做的事情:

      服务器端

      var num_of_clients = io.sockets.clients().length;
      io.sockets.send(num_of_clients);
      

      客户端:

      ws = io.connect...
      ws.on('message', function(data)
      {
      var sampleAttributes = fullData.split(',');
      if (sampleAttributes[0]=="NumberOfClients")
              {
                  console.log("number of connected clients = "+sampleAttributes[1]);
              }
      });
      

      【讨论】:

      • 那你一定是做错了什么...当前文档状态为“emit”socket.io/docs
      【解决方案4】:

      你可以按照这个例子来实现你的场景。

      您可以让所有客户加入一个公共房间以发送一些更新。 每个套接字都可以像这样加入房间:

      currentSocket.join("client-presence") //can be any name for room
      

      然后你可以让客户端在你的套接字中输入密钥,其中包含多个客户端的数据(id 和状态),如果一个客户端的状态发生变化,你可以像这样在套接字上接收更改事件:

      socket.on('STATUS_CHANGE',emitClientsPresence(io,namespace,currentSocket); //event name should be same on client & server side for catching and emiting
      

      现在您希望所有其他客户端都得到更新,因此您可以执行以下操作:

      emitClientsPresence => (io,namespace,currentSocket) {
        io.of(namespace)
              .to(client-presence)
              .emit('STATUS_CHANGE', { id: "client 1", status: "changed status" });
      }
      

      这将向所有已加入“client-presence”房间的套接字发出 STATUS_CHANGE 事件,然后您可以在客户端捕获相同的事件并更新其他客户端的状态。

      【讨论】:

        【解决方案5】:

        据此Broadcasting。 使用 nodejs 服务器,你可以使用这个:

        io.emit('event_id', {your_property: 'your_property_field'});
        

        一定要初始化websocket,例如:

        var express = require('express');
        var http = require('http');
        var app = express();
        var server = http.Server(app);
        var io = require('socket.io')(server);
        
        app.get('/', function (req, res) {
            res.send('Hello World!');
            io.emit('event_hello', {message: 'Hello Socket'});
        });
        
        server.listen(3000, function () {
          console.log('Example app listening on port 3000!');
        });
        

        在这种情况下,当用户到达您的服务器时,将使用 json 对象 {message: 'Hello Socket'} 向所有 web-socket 客户端广播“event_hello”。

        【讨论】:

          猜你喜欢
          • 2013-11-17
          • 1970-01-01
          • 2021-07-10
          • 2016-10-19
          • 2017-08-17
          • 2016-03-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多