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

33

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

7个回答

35

WebSockets使用TCP协议,它是点对点的,并且不提供广播支持。


1
即使使用一些脚本语言,广播的速度是否与逐个发送消息的速度相同? - boh
2
一个Websocket框架可能会使“广播”变得容易,但在幕后它将发送离散的消息。这就是为什么大多数服务器和主机限制连接的客户端数量(Heroku限制曾经是每个Dyno 600个客户端)。 - Myst
我知道这是老旧的内容,但今天我找到它,所以显然仍然可见。现在有很多选项可以“广播”到所有连接的Websockets。如果您使用节点服务器,可以使用类似于“npm i ws”的库,并循环遍历每个客户端并发送数据。 - M H
1
循环遍历每个客户并不是一种有效的方式,尤其是当你有大量客户时。这会导致在循环中最后一个客户的处理被延迟。那么,有什么替代方案呢? - Susarla Nikhilesh

34

不确定你的客户端/服务器设置如何,但你可以在服务器上保留一个所有连接客户端的集合,然后迭代每个客户端并发送消息。

以下是使用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);
    });
  });
});

由于发送只是本地复制到套接字缓冲区,因此这应该非常快,但会占用大量内存。出于这个原因,大多数浏览器限制并发Websockets的数量在256以下。 - Dominic Cerisano
4
如果客户端断开连接,send()函数将抛出异常,因此您需要侦听“close”事件以删除已断开的客户端。 - broofa

25

正如其他答案中所述,WebSockets不支持组播,但是'ws'模块似乎为您维护了一个连接客户端列表,因此很容易对其进行迭代。来自文档

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

wss.broadcast = function(data) {
  wss.clients.forEach(client => client.send(data));
};

2
但是如果有10000个用户连接,我需要循环遍历所有用户吗?这太费时间了。是否有一种技术可以向某些用户广播? - mandaputtra
2
@mandaputtra,“WebSockets不支持多播”- 你还需要什么信息? - Rob Grant
@mandaputtra 还有其他允许广播的网络协议。例如,“组播寻址”(请谷歌一下)可以让你在OSI层2或3上进行广播。但是,WebSockets基于HTTP over TCP,本质上不支持广播。因此,要向子集或所有客户端发送消息,您需要迭代所有连接的客户端。 - broofa

3

0

Microsoft.Web.WebSockets 命名空间具有广播功能的 WebSocketCollection。在 Nuget 中查找该程序集。名称为 Microsoft.WebSockets。


0

0

是的,你可以这样做,而且有很多使用不同脚本语言编写的套接字服务器正在这样做。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接