30

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

4

7 回答 7

32

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

于 2010-07-01T09:06:51.240 回答
28

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

一个使用 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);
    });
  });
});
于 2014-11-22T01:15:49.060 回答
21

如其他答案所述,WebSockets 不支持多播,但看起来“ws”模块为您维护了一个已连接客户端的列表,因此迭代它们非常容易。从文档

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

wss.broadcast = function(data) {
  wss.clients.forEach(client => client.send(data));
};
于 2016-08-03T21:36:33.753 回答
3

是的,可以向多个客户端广播消息。

在 Java 中,

  @OnMessage
  public void onMessage(String m, Session s) throws IOException {
  for (Session session : s.getOpenSessions()) {
    session.getBasicRemote().sendText(m);
   }
}

在这里解释一下。 https://blogs.oracle.com/PavelBucek/entry/optimized_websocket_broadcast

于 2014-07-31T10:41:43.123 回答
0

是的,您可以,并且有许多使用各种脚本语言编写的套接字服务器正在执行此操作。

于 2011-11-24T10:19:32.730 回答
0

这实际上取决于服务器端。这是一个使用Tomcat7完成的示例:

Tomcat 7 聊天 Websockets Servlet 示例

并解释它是如何在这里构建的。

于 2012-09-10T16:54:13.373 回答
0

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

于 2014-02-25T19:40:42.183 回答