2010-07-01 55 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); 
    }); 
}; 
相關問題