2010-07-01 20 views
11

Supongo que esto no es posible, pero quería preguntar en caso de que lo sea. Si deseo proporcionar una página web de información de estado, quiero usar WebSockets para enviar los datos del servidor al navegador. Pero mis preocupaciones son el efecto que una gran cantidad de navegadores tendrán en el servidor. ¿Puedo transmitir a todos los clientes en lugar de enviar mensajes discretos a cada cliente?¿Puedo transmitir a todos los clientes de WebSocket

Respuesta

16

WebSockets utiliza TCP, que es punto a punto, y no proporciona soporte de difusión.

+1

por lo que incluso con un poco de lenguaje de script, no radiodifusión realizar a la misma velocidad como el envío de mensajes uno por uno? – boh

+1

Un marco Websocket podría facilitar la "Transmisión", pero enviará mensajes discretos bajo el capó. Esta es la razón por la que la mayoría de los servidores y hosts limitan la cantidad de clientes conectados (el límite de Heroku solía ser de 600 clientes por Dyno). – Myst

1

Sí, puede y hay muchos servidores de socket escritos en varios lenguajes de scripts que lo están haciendo.

0

Depende del servidor realmente. Aquí está un ejemplo de cómo se hace usando Tomcat7:

Tomcat 7 Chat Websockets Servlet Example

y una explicación de la forma en que está construido here.

+0

el enlace no funciona –

+0

@ArchimedesTrajano Enlace roto. –

0

El espacio de nombres Microsoft.Web.WebSockets tiene una capacidad WebSocketCollection with Broadcast. Busque el montaje en Nuget. El nombre es Microsoft.WebSockets.

12

No estoy seguro de cómo es la configuración de su cliente/servidor, pero siempre puede mantener en el servidor una colección de todos los clientes conectados, y luego iterar sobre cada uno y enviar el mensaje.

Un ejemplo sencillo usando la biblioteca WebSocket del Nodo:

código de servidor

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

Dado que send es solo una copia nativa de los búferes de socket, esto debería ser muy rápido, pero con una gran cantidad de memoria. La mayoría de los navegadores limitan la cantidad de websockets concurrentes a menos de 256 por este motivo. –

+1

send() arrojará excepciones si el cliente se ha desconectado, por lo que querrá escuchar el evento 'cerrar' para eliminar clientes desconectados. – broofa

2

Como se ha señalado en otras respuestas, WebSockets no soportan multidifusión, pero parece que el módulo 'ws' mantiene una lista de clientes conectados para usted, por lo que es bastante fácil de iterar a través de ellos. De 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); 
    }); 
}; 
Cuestiones relacionadas