2010-07-01 57 views
11

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

回答

16

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

+1

因此,即使使用某种脚本语言,广播的执行速度与发送消息的速度一样吗? – boh 2013-05-22 05:21:26

+1

Websocket框架可能使“广播”变得容易,但它将在发送引擎下发送离散消息。这就是为什么大多数服务器和主机限制连接客户端的数量(每个Dyno的Heroku限制为600个客户端)。 – Myst 2015-07-18 00:41:41

1

是的,你可以和许多套接字服务器在那里写在各种脚本语言,这样做。

0

这实际上取决于服务器端。下面是它是如何使用Tomcat7做了一个例子:

Tomcat 7 Chat Websockets Servlet Example

和的它是如何构建的here的解释。

+0

该链接不起作用 – 2013-06-21 01:43:11

+0

@ArchimedesTrajano修复了断开的链接。 – 2013-06-21 11:43:51

0

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

12

不知道你的客户端/服务器设置如何,但你总是可以在服务器中保存所有连接客户端的集合 - 然后迭代每个客户端并发送消息。使用节点的WebSocket的图书馆

一个简单的例子:

Server代码

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); 
    }); 
    }); 
}); 
+0

由于send只是套接字缓冲区的本地副本,所以这应该非常快,但内存密集。由于这个原因,大多数浏览器将并发websocket的数量限制在256以下。 – 2016-06-02 13:24:52

+1

如果客户端已断开连接,send()将引发异常,因此您需要侦听'close'事件以删除断开连接的客户端。 – broofa 2016-08-03 21:29:25

2

在其他的答案指出,WebSockets的不支持组播,但它看起来像“WS”模块维护为您连接的客户端列表,因此遍历它们非常简单。从the docs

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

wss.broadcast = function broadcast(data) { 
    wss.clients.forEach(function each(client) { 
    client.send(data); 
    }); 
}; 
相关问题