我可以向所有WebSocket客户端广播

Ber*_*ann 16 html5 websocket

我假设这是不可能的,但想要问以防万一.如果我想提供状态信息网页,我想使用WebSockets将数据从服务器推送到浏览器.但我担心的是大量浏览器对服务器的影响.我可以向所有客户端广播,而不是向每个客户端发送离散消息吗?

nos*_*nos 20

WebSockets使用TCP,它是点对点的,不提供广播支持.

  • Websocket 框架可能使“广播”变得容易,但它会在幕后发送离散消息。这就是大多数服务器和主机限制连接客户端数量的原因(Heroku 限制曾经是每个 Dyno 600 个客户端)。 (2认同)

Nic*_*fal 14

不确定您的客户端/服务器是如何设置的,但您始终可以在服务器中保留所有连接客户端的集合 - 然后迭代每个客户端/服务器并发送消息.

使用Node的Websocket库的一个简单示例:

服务器代码

var WebSocketServer = require('websocket').server;

var clients = [];
var socket = new WebSocketServer({
  httpServer: server,
  autoAcceptConnections: false
});

socket.on('request', function(request) {
  var connection = request.accept('any-protocol', request.origin);
  clients.push(connection);

  connection.on('message', function(message) {
    //broadcast the message to all the clients
    clients.forEach(function(client) {
      client.send(message.utf8Data);
    });
  });
});
Run Code Online (Sandbox Code Playgroud)

  • 如果客户端断开连接,send() 将抛出异常,因此您需要监听 'close' 事件以删除断开连接的客户端。 (2认同)

bro*_*ofa 8

正如其他答案所述,WebSockets不支持多播,但看起来'ws'模块为您维护一个连接客户端列表,因此很容易迭代它们.来自文档:

var WebSocketServer = require('ws').Server
  , wss = new WebSocketServer({ port: 8080 });

wss.broadcast = function broadcast(data) {
  wss.clients.forEach(function each(client) {
    client.send(data);
  });
};
Run Code Online (Sandbox Code Playgroud)

  • 但是为了避免看到有 10000 个用户连接,我需要将它们全部循环吗?其耗时。有什么技术可以向某些用户广播 (2认同)
  • @mandaputtra _“WebSockets 不支持多播”_ - 您还需要什么信息? (2认同)