websockets socket real node example javascript websocket multiplayer

javascript - node - ¿Son adecuados los WebSockets para los juegos multijugador en tiempo real?



websocket php (5)

Básicamente, tienes 3 opciones en el momento de escribir esto:

WebSockets

WebSockets es un protocolo de mensajería liviano que utiliza TCP, en lugar de una implementación de Javascript de sockets TCP, como ha notado. Sin embargo, más allá del saludo inicial, no hay encabezados HTTP que se pasen más allá de ese punto. Una vez que se establece la conexión, los datos pasan libremente, con una sobrecarga mínima.

Sondeo largo

Long-polling, en pocas palabras, implica que el cliente interrogue al servidor para obtener nueva información periódicamente con solicitudes HTTP. Esto es extremadamente costoso en términos de CPU y ancho de banda, ya que está enviando un nuevo encabezado HTTP cada vez. Esta es esencialmente su única opción cuando se trata de navegadores más antiguos, y las bibliotecas como Socket.io utilizan el sondeo largo como una alternativa en estos casos.

WebRTC

Además de lo que ya se ha mencionado, WebRTC permite la comunicación a través de UDP. UDP se ha usado durante mucho tiempo en juegos multijugador en entornos no basados ​​en web debido a su baja sobrecarga (relativa a TCP), baja latencia y naturaleza no bloqueante.

TCP "garantiza" que cada paquete llegará (salvo falla catastrófica de la red) y que siempre llegarán en el orden en que se enviaron. Esto es ideal para información crítica, como el registro de puntajes, visitas, chat, etc.

UDP, por otro lado, no tiene tales garantías. Los paquetes pueden llegar en cualquier orden, o no llegar en absoluto. Esto es realmente útil cuando se trata de datos menos críticos que se envían a una frecuencia alta y deben llegar lo más rápido posible, como las posiciones o las entradas de los jugadores. La razón es que las transmisiones TCP están bloqueadas si un solo paquete se retrasa durante el transporte, lo que genera grandes lagunas en las actualizaciones del estado del juego. Con UDP, puede simplemente ignorar los paquetes que lleguen tarde (o no recibirlos), y continuar con el próximo que reciba, creando una experiencia más fluida para el jugador.

En el momento de escribir estas líneas, WebSockets es probablemente su mejor opción, aunque la adopción de WebRTC se está expandiendo rápidamente, y puede ser preferible en el momento en que haya terminado con su juego, así que eso es algo a considerar.

Estoy interesado en crear un pequeño juego multijugador en tiempo real, usando HTML5 / JavaScript para el cliente y probablemente Java para el software del servidor.

Miré un poco en WebSockets, pero parece que tenía ideas erróneas sobre lo que realmente son WebSockets. Inicialmente pensé en WebSockets como la forma en que JavaScript maneja los sockets TCP, tal como se usan en Java y en otros lenguajes, pero parece que hay que llevar a cabo todo un proceso de handshaking, y cada transmisión incluye mucha sobrecarga HTTP (y en ese caso, los beneficios sobre Ajax no parecen tan emocionantes como a primera vista)?

Sobre un tema relacionado, ¿hay alguna alternativa mejor a WebSockets para este propósito (juegos multijugador en tiempo real en JavaScript)?


Los juegos multijugador requieren que el servidor envíe instantáneas periódicas del estado mundial al cliente. En el contexto de una aplicación HTML / js del navegador, tiene pocas opciones: sondeo, websocket o escribir su propio complemento para extender las capacidades del navegador.

El sondeo HTTP como BOSH o Bayeux son sofisticados pero presentan sobrecarga de red y latencia. El websocket fue diseñado para superar sus limitaciones y es definitivamente más receptivo.

Las bibliotecas, como cometd o socket io , proporcionan una abstracción del transporte y resuelven los problemas de compatibilidad del navegador por usted. Además de eso, permite cambiar entre los transportes subyacentes y comparar su rendimiento sin esfuerzo.

Codifiqué el juego arcade multijugador con socket.io y usualmente mido 2ms de latencia con un websocket y alrededor de 30ms con xhr-polling en lan. Es suficiente para juegos multijugador.

Le sugiero que eche un vistazo a nodejs y socket.io para poder compartir el código entre el cliente y el servidor, también puede tomar prestado un código multijugador en [ 3 ].


No estoy seguro si WebSockets sigue siendo la mejor herramienta para crear redes de multijugador en tiempo real en estos días (2017). WebRTC es una tecnología más nueva que ofrece el potencial de un rendimiento mucho más alto. Y en estos días, WebRTC también es más fácil de usar gracias a las siguientes bibliotecas:

  • node-webrtc simplifica las redes del lado del servidor
  • webrtc-native que también proporciona una biblioteca del lado del servidor, y podría ser más rápido como su nombre lo sugiere
  • electron-webrtc proporciona una implementación que es una buena electron-webrtc si quieres empaquetar tu juego usando electron

Alternativamente, si quiere que se le ahorren los detalles reales de la implementación de redes, y está buscando una biblioteca que proporcione una interfaz multijugador de nivel superior, eche un vistazo a Lance.gg . (descargo de responsabilidad: soy uno de los contribuyentes).


Si está planeando usar JavaScript para su juego (como lo es) entonces WebSocket es la mejor opción para usted. Y si desea soportar versiones anteriores de Internet Explorer, piense en el sistema de Signal R desarrollado por Microsoft. Están usando WebSocket bajo el capó, pero también tienen algunas opciones de retroceso ... para que el protocolo use la mejor solución disponible.

http://signalr.net/


WebSockets es la mejor solución para juegos multijugador en tiempo real que se ejecutan en un navegador web. Como se señala en los comentarios, hay un primer apretón de manos donde la conexión HTTP se actualiza, pero una vez que se establece la conexión, WebSockets ofrece el mecanismo de conexión de latencia más bajo para la comunicación bidireccional entre un servidor y un cliente.

Te recomiendo que mires esto: https://www.youtube.com/watch?v=_t28OPQlZK4&feature=youtu.be

Mira esto:

La única solución TCP sin procesar sería usar un complemento que admita algún tipo de objeto TCPClient. Te recomendaría que pruebes WebSockets.

Puedes encontrar una serie de opciones here . Simplemente busque WebSockets dentro de la página.

También echa un vistazo a WebRTC . Dependiendo del propósito de su juego y de si necesita que su servidor administre el estado del juego, puede usar esta tecnología para la comunicación de igual a igual. Es posible que aún necesite una solución para manejar el poner jugadores en grupos, en ese caso, WebSockets es la solución más rápida / mejor.