2010-07-01 22 views
11

Suppongo che ciò non sia possibile, ma volevo chiedere in caso affermativo. Se desidero fornire una pagina Web di informazioni sullo stato, desidero utilizzare WebSockets per trasferire i dati dal server al browser. Ma le mie preoccupazioni sono l'effetto che un grande numero di browser avrà sul server. Posso trasmettere a tutti i client piuttosto che inviare messaggi discreti a ciascun client?Posso trasmettere a tutti i client WebSocket

risposta

16

WebSockets utilizza TCP, che è punto a punto e non fornisce supporto di trasmissione.

+1

quindi, anche con un po 'di linguaggio di scripting, la trasmissione funziona alla stessa velocità dell'invio di un messaggio uno alla volta? – boh

+1

Un framework Websocket potrebbe facilitare la "trasmissione", ma invierà messaggi discreti sotto il cofano. Questo è il motivo per cui la maggior parte dei server e degli host limitano il numero di client connessi (il limite di Heroku era 600 client per Dyno). – Myst

1

Sì, è possibile e ci sono molti socket server scritti in vari linguaggi di scripting che lo stanno facendo.

0

Dipende dal lato server realmente. Ecco un esempio di come si fa usando Tomcat7:

Tomcat 7 Chat Websockets Servlet Example

e una spiegazione del modo in cui è costruito here.

+0

il collegamento non funziona –

+0

@ArchimedesTrajano Collegamento interrotto corretto. –

0

Lo spazio dei nomi Microsoft.Web.WebSockets ha una funzionalità WebSocketCollection con trasmissione. Cerca l'assemblea a Nuget. Il nome è Microsoft.WebSockets.

12

Non sono sicuro di come si configuri il client/server, ma si può sempre conservare nel server una raccolta di tutti i client connessi, quindi scorrere su ciascuno di essi e inviare il messaggio.

Un semplice esempio usando la libreria websocket del nodo:

codice 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

Poiché send è solo una copia nativa per i buffer del socket, questo dovrebbe essere molto veloce, ma intensivo della memoria. La maggior parte dei browser limita il numero di websocket concorrenti a meno di 256 per questo motivo. –

+1

send() genererà eccezioni se il client è disconnesso, quindi ti consigliamo di ascoltare l'evento 'close' per rimuovere i client disconnessi. – broofa

2

Come già sottolineato in altre risposte, WebSockets non supportano il multicast, ma sembra che il modulo 'ws' mantiene una lista di client connessi per te, quindi è abbastanza facile iterarli attraverso di loro. Da 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); 
    }); 
}; 
Problemi correlati