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
WebSockets utiliza TCP, que es punto a punto, y no proporciona soporte de difusión.
Sí, puede y hay muchos servidores de socket escritos en varios lenguajes de scripts que lo están haciendo.
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.
el enlace no funciona –
@ArchimedesTrajano Enlace roto. –
El espacio de nombres Microsoft.Web.WebSockets tiene una capacidad WebSocketCollection with Broadcast. Busque el montaje en Nuget. El nombre es Microsoft.WebSockets.
Sí, es posible transmitir mensajes a múltiples clientes.
En Java,
@OnMessage
public void onMessage(String m, Session s) throws IOException {
for (Session session : s.getOpenSessions()) {
session.getBasicRemote().sendText(m);
}
}
y aquí se explica. https://blogs.oracle.com/PavelBucek/entry/optimized_websocket_broadcast.
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);
});
});
});
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. –
send() arrojará excepciones si el cliente se ha desconectado, por lo que querrá escuchar el evento 'cerrar' para eliminar clientes desconectados. – broofa
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);
});
};
- 1. ¿Cómo transmitir malas noticias a los clientes?
- 2. Mandato de envío a todos los clientes conectados
- 3. Enviar mensaje signalr de servidor a todos los clientes
- 4. Transmitir una notificación a todos los dispositivos registrados
- 5. Eliminar todos los clientes en Magento
- 6. Netty: cómo obtener todos los canales de clientes?
- 7. Proponiendo Glassfish a los clientes
- 8. WebSocket
- 9. ¿Cómo puedo transferir bytes en fragmentos a los clientes?
- 10. Instrucción SQL para obtener todos los clientes sin pedidos
- 11. Obtener todos los encabezados de clientes en FastCGI (C/C++)
- 12. Creación del mismo SignalR Hub para todos los clientes
- 13. Enviar un mensaje a todos los clientes de un Grupo, a excepción del cliente actual
- 14. ¿Cómo puedo enviar mensajes más grandes a través de WebSocket?
- 15. ASP.NET - Comet Envío de mensajes desde el servidor a todos los clientes
- 16. ¿Cómo puedo enviar un mensaje de notificación desde el servidor a todos los clientes en WCF (difusión que puede decir)?
- 17. Ayudando a los gerentes y clientes a entender SOA
- 18. ¿Cómo puedo reproducir trozos de un video que vengan a través de un websocket HTML5?
- 19. Sincronización en tiempo real de los datos de la base de datos en todos los clientes
- 20. Transmitir de ConcurrentDictionary a IDictionary
- 21. ¿Cómo puedo forzar a Rails a cargar todos los modelos?
- 22. ¿Cómo recoger los comentarios de los clientes?
- 23. Convencer a los clientes para que actualicen a Java 5
- 24. ¿Transmitir a LPCWSTR?
- 25. node.js servidor http, detectar cuando los clientes se desconectan
- 26. Medición del rendimiento de los clientes
- 27. Enviar datos desde la aplicación de rieles a los clientes
- 28. Transmitir video en Java
- 29. Recepción de imágenes a través de websocket
- 30. Servidor Websocket con PHP
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
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