ajax html5 comet multiplayer

¿Hay una alternativa de ajax que no requiera un sondeo sin modificaciones del lado del servidor?



html5 comet (6)

Intento crear un pequeño y básico juego de varios jugadores basado en "ajax". Las coordenadas de los objetos están siendo dadas por un "manejador" de PHP. Este archivo handler.php se está sondeando cada 200MS, utilizando ajax.

Como no hay necesidad de sondear cuando no sucede nada, me pregunto si hay algo que pueda hacer lo mismo sin una encuesta frecuente. P.ej. Comet, aunque escuché que necesita configurar las aplicaciones del lado del servidor para Comet. Es un servidor web compartido, así que no puedo hacer eso.

Quizás evite que el archivo handler.php incluso devuelva una respuesta si no hay que cambiar nada en el cliente, ¿es posible? Por otra parte, todavía tendría al cliente inútilmente pidiéndole una respuesta aunque algo no haya cambiado todavía. Básicamente, solo debe usar ancho de banda y cortar recursos si algo necesita ser dicho al cliente, ej. el cambio de coordenadas de un objeto


Comet se utiliza generalmente para este tipo de cosas, y puede ser una configuración frágil, ya que no es una tecnología particularmente común, por lo que puede ser fácil no "hacer las cosas bien". Dicho esto, hay más recursos disponibles ahora que la última vez que lo intenté ~ hace 2 años.

No creo que pueda hacer lo que está pensando y handler.php simplemente no devuelve nada y detiene la ejecución: el servidor web mantendrá la conexión abierta y evitará más sondeos hasta que handler.php haga algo (finalice o proporcione resultados). ) Cuando lo hace, todavía está manejando una respuesta.

Puede probar una técnica larga de sondeo, donde su AJAX permite un tiempo de espera muy grande (por ejemplo, 30 segundos) y giros de handler.php sin responder hasta que tenga algo que informar, luego regresa. (Querrá asegurarse de que la rotación no requiera muchos recursos). Si handler.php "expira" y no ocurre nada, haz que salga y deja que AJAX vuelva a sondear. Como solo ocurre cada 30 segundos, será una gran mejora más de ~ 5 veces por segundo. Eso mantendría su votación al mínimo.

Pero ese es el tipo de cosas para las que está diseñado Comet.


Como Ajax solo le ofrece un modelo de solicitud de servidor de cliente (normalmente denominado extracción, en lugar de inserción), la única forma de obtener datos del servidor es a través de solicitudes. Sin embargo, una técnica común para evitar esto es que el servidor solo responda cuando tenga nuevos datos. Entonces, el cliente hace una solicitud, el servidor se queda pendiente de esa solicitud hasta que algo sucede y luego responde. Esto evita la necesidad de realizar encuestas con frecuencia incluso cuando los datos no han cambiado, ya que solo necesita que el cliente envíe una nueva solicitud después de recibir una respuesta.

Dado que está utilizando PHP, un método simple podría ser que el código PHP llame al comando de suspensión durante 200 ms a la vez entre las comprobaciones de cambios de datos y luego devuelva los datos al cliente cuando cambie.

EDITAR: También recomendaría tener un tiempo de espera en la solicitud. Entonces, si no ocurre nada durante 2 segundos, se envía un mensaje de "no cambio". De esa forma, el cliente sabe que el servidor todavía está vivo y procesando su solicitud.


El servidor debe tomar parte en esto. Consulte con el proveedor de hosting qué módulos están disponibles. O intenta convencerlos de que apoyen a Comet.

Tal vez deberías considerar un pequeño servidor privado virtual (VPS) para esto.


Una cosa que debe agregarse a las largas sugerencias de sondeo: si se encuentra en un servidor compartido, esta solución tendrá una escalabilidad limitada, ya que cada encuesta larga activa mantendrá activa una conexión (y un proceso del lado del servidor para dar servicio a esa conexión). Lo más probable es que su proveedor tenga límites (ya sean definidos por la política o de facto) sobre la cantidad de conexiones que puede tener abiertas a la vez, de modo que chocará contra un muro si tiene más sesiones / ventanas que las que se reproducen al mismo tiempo.


Dado que esto está etiquetado como "html5": HTML5 tiene <eventsource> y WebSocket , pero el lado de la implementación todavía está en el tiempo futuro en la práctica.

Opera implementó una versión anterior de <eventsource> llamada <event-source> .


Aquí hay una solución: use un proveedor de cometas SaaS, como WebSync On-Demand . No hay recursos de servidor de qué preocuparse, alojamiento compartido o no, ya que está descargado, y puede enviar la información según sea necesario.

Como es SaaS, funcionará con cualquier lenguaje de servidor. Para PHP, ya hay un editor escrito y listo para funcionar.