javascript node.js networking udp

javascript - Node.js UDP para juego multijugador en tiempo real



networking (3)

Estoy construyendo un juego basado en un navegador multijugador en tiempo real usando node.js. En este momento, el cliente envía la entrada del usuario al servidor de lógica de juegos a través de socket.io y una instantánea del mundo del juego enviado al cliente para su renderizado.

A continuación hay una versión simplificada del código. ¿Es posible usar UDP para enviar datos del cliente basado en navegador al servidor y viceversa? Sé que Node.js tiene un módulo UDP, pero no estoy seguro de cómo implementarlo de esta manera.

Cualquier ayuda sería apreciada. Gracias.

Servidor:

var server = http.createServer(handler).listen(8888); var iosocket = io.listen(server); // request/response handler function handler(req, res){ ... } iosocket.sockets.on(''connection'', function(socket){ console.log("[x] Socket listener started"); socket.on(''msg'', function(data){ console.log( " [-] incoming message); }); }); ... iosocket.sockets.emit("message", msg);

Cliente:

<!DOCTYPE html> <html> <head> <title>Test</title> <script type="text/javascript" src="/socket.io/socket.io.js"></script> <script type="text/javascript"> socket.on(''connect'', function(){ console.log("connected to server"); }); socket.on(''message'', function(message){ console.log(''received message''); }); </script> </head> <body> <canvas id=''canvas'' width="400" height="400">Canvas</canvas> </body> </html>


En general, los navegadores no admiten conexiones UDP. Específicamente, algunos navegadores lo hacen. Google Chrome tiene una api de socket:

http://developer.chrome.com/trunk/apps/socket.html

[2012/10/29 Editado como socket ya no es experimental - PhilH]

También podría usar las API de socket desde las interfaces de cliente nativas (no estoy seguro, solo estoy adivinando).

Si vas a intentar hacer algo en tiempo real en buscadores en un futuro cercano, Websockets es probablemente tu mejor opción, pero solo son TCP.

En cuanto a sus comentarios sobre UDP frente a velocidad TCP, UDP siempre será más rápido. TCP ofrece garantías de pedido y entrega (esto significa posibles reintentos y retener otros paquetes hasta que un paquete perdido finalmente llegue a su destino), mientras que UDP solo promete enviarlo una vez, sin preocuparse por lo que ocurra después. UDP solo enviará su paquete una vez y deberá averiguar si se perdió. Cuando / si recibe muchos paquetes UDP, si el orden es importante, debe codificar esto en su carga de datos para poder resolverlo.

En general, UDP será ideal para paquetes donde faltar unos pocos no importa y donde solo importa el último paquete. Un juego puede usar típicamente una secuencia TCP donde importa el orden y la entrega garantizada (lo importante), y flujos UDP para movimientos de objetos, etc. (donde solo importa la última posición, y si una actualización se pierde, no importa, siempre que cada el paquete contiene la posición completa [en lugar de un delta donde todos los paquetes importan]).

Para su propio juego, le sugiero que lo implemente primero en TCP, y luego, cuando tenga más experiencia, puede intentar mover el material crítico en el tiempo (donde el orden y los paquetes perdidos importan menos) en flujos UDP separados. Hay muchos proyectos que han fallado porque las personas comenzaron con UDP primero, y luego trataron de atornillar las garantías de pedido y entrega además de eso, tratando efectivamente de volver a implementar TCP. Por eso hacerlo al revés tiene más sentido.


var server = require(''http'').createServer(); require(''dgram-browserify'').listen(server); server.listen(8080);


Una aplicación en tiempo real generalmente es aquella que recibe actualizaciones de datos de al menos 30 Hz y con menos de 10% de inestabilidad. TCP / IP es confiable pero no puede enviar actualizaciones periódicas a esa velocidad sin que la fluctuación de fase se salga de la escala ocasionalmente. Esto se debe a que el TCP es un protocolo de enlace y reconocimiento para garantizar una transmisión confiable que obstaculiza el envío rápido de actualizaciones periódicas. UDP es un protocolo más simple donde los datos del socket son fuego y olvidan. Esto en sí mismo es un problema, pero ese problema es más fácil de superar que la escasa inestabilidad de TCP / IP. En mi experiencia, UDP es el único camino a seguir y por qué las aplicaciones en tiempo real lo usan dentro de protocolos como el RTP utilizado en VoIP.

Web Sockets también son una falsa esperanza ya que es un protocolo basado en TCP. Utilizo sockets UDP personalizados en los que el emisor y el receptor mantienen un número de secuencia y pueden indicarle si los paquetes se pierden, duplican o no, todos los problemas en las redes WAN. Encuentre maneras de usar UDP e instrumentar los paquetes de datos entrantes para medir el rendimiento.