Foros del Web » Programando para Internet » Node.js »

[SOLUCIONADO] Comunicación Cliente-Servidor correcta

Estas en el tema de Comunicación Cliente-Servidor correcta en el foro de Node.js en Foros del Web. Hola, He realizado una aplicación bastante completa bajo PHP, HTML, JavaScript (jQuery) y MySQL. En resumen, lo que la aplicación hace es recoger datos de ...
  #1 (permalink)  
Antiguo 16/11/2011, 04:07
 
Fecha de Ingreso: noviembre-2007
Mensajes: 23
Antigüedad: 17 años
Puntos: 4
Pregunta Comunicación Cliente-Servidor correcta

Hola,
He realizado una aplicación bastante completa bajo PHP, HTML, JavaScript (jQuery) y MySQL. En resumen, lo que la aplicación hace es recoger datos de una máquina, y gestionar dichos datos a través de una interfaz web.

Dicha aplicación la tengo realizada, y funcional, a través de métodos poco ortodoxos de programación (a mi parecer). Por ejemplo, la información de la máquina haría el siguiente recorrido:

1. Un script PHP ejecutado en segundo plano recoge datos de la máquina y los guarda en un fichero XML. Dicho Script sólo será ejecutado una vez y seguirá funcionando a través de un bucle infinito y "ignore_user_abort".

2. El cliente recoge dicha información del fichero a través de PHP y la muestra en un formulario oculto. Dicho PHP es ejecutado por AJAX cada X segundos dentro de la propia web.

3. JavaScript recoge la información del formulario, carga los elementos de la página oportunos y realiza las acciones necesarias con AJAX.


Ahora quiero realizar la aplicación de nuevo, al completo con PHP Orientado a Objetos, y por tanto quiero reducir al mínimo la cantidad de procesos por los que tiene que ser transportada la información.
La intención es hacer algo parecido a lo que hace gMail con los mensajes nuevos. Cuando recibe un mensaje nuevo, este recibe un fichero JSON. Yo por el contrario tengo que estar siempre solicitando la información al servidor, es decir, cada X segundos conecto con el servidor, y le solicito determinada información. Esto en cada cliente.
Yo pretendo que cuando el servidor recoja la información la mande al cliente directamente sin que este tenga que solicitarle nada. De esta forma, además, podré controlar cuantos clientes hay conectados.
Pero no logro encontrar nada en claro, por ello espero que podáis echarme una mano con estas comunicaciones. La aplicación funciona sobre un servidor Apache. Lo más parecido que he probado ha sido:

- HTML5 WebSocket: Sin duda, me vendría de perlas utilizar esta API en la aplicación. Mi problema es crear un servidor de WebSocket. Existe mucha información sobre cliente, pero sobre servidor apenas hay nada, y lo que hay es de pago.

- Long-Polling: después de investigar sobre esta función de AJAX, me doy cuenta de que apenas aporta nada. De nuevo, el cliente debe solicitar información cada X segundos.

Comet: por la información encontrada, diría que es lo que estoy buscando. Pero a veces parece que se trata, de nuevo, de un simple Long-Polling. Creo que se debe a que necesito un servidor compatible con Comet.

- Node.JS: Supuestamente permite utilizar WebSocket. El problema es que se ejecuta a través del terminal, y el servidor no estará siempre encendido. Además, tampoco existe mucha información/documentación al respecto, por lo que no he conseguido sacar nada en claro.

- CometD: enrutador que utiliza la tecnología Comet a través del protocolo Bajeux. Tampoco se exactamente como utilizarlo bajo Apache ni que puedo sacar en claro.

- Dojo WebSocket: Sin un servidor de WebSocket, esta API de Dojo lo único que hace es Long-Polling.

- pyWebSocket: realiza, ahora sí, compatibilidad entre Apache y WebSocket. El problema es que utiliza el desaparecido/muerto lenguaje Python. Aún no he logrado añadir el módulo python (mod_python) a mi instalación de Apache, y apenas existe información clara.

- Módulo WebSocket para Apache: debería ser lo más sencillo. Un módulo para Apache que permita realizar conexiones de WebSocket. El problema es que no logro instalarlo en el servidor que tengo (XAMPP) sino que se instala en el servidor/ruta por defecto, o eso entiendo.



Como podéis comprobar, he indagado bastante en el tema sin éxito alguno. La comunicación perfecta sería la siguiente:

Máquina --> JavaScript Servidor --> JavaScript cliente --> HTML/PHP cliente

Pero no encuentro nada para hacerlo ni parecido. Son muchos los problemas que se me juntan y la verdad estoy completamente perdido.
Espero que alguno de vosotros haya trasteado un poco este tema y pueda arrojarme algo de luz.

Información: Servidor Apache, a través de XAMPP o Zend Server, en MacOS.

Por lo demás, disculpen por un POST tan largo (y eso que me he dejado cosas atrás)

Muchas gracias.
  #2 (permalink)  
Antiguo 16/11/2011, 08:13
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 16 años, 3 meses
Puntos: 1532
Respuesta: Comunicación Cliente-Servidor correcta

1 - Ajax longpolling no consiste en enviar n peticiones x segundo, estás errado: el longpolling consiste en que el cliente envía una petición ajax y el server la mantiene abierta hasta un nuevo evento, obviamente cuando el server contesta se cumple el ciclo HTTP y se cierra la conexión, es allí donde el cliente vuelve a establecer otra petición AJAX, ¿ventajas?: que se reduce considerablemente el ancho de banda al mantener una conexión activa por más tiempo que es mejor que enviar n peticiones cada segundo, es una técnica muy utilizada por chats y se ha comprobado que es eficiente, sin embargo puede llegar a consumir mucho del servidor.

2 - "el servidor no estará siempre encendido": entonces No es un servidor, además un servidor bien configurado puede reiniciarse a consecuencia de fallas de energía, con respecto a node.js puedes hacer que se ejecute automáticamente al iniciar el OS, además de que existen muchas técnicas para prevenciones de caídas de servicios como virtualización, balance de carga o dispositivos para servidores de alta disponibilidad; así que usar WebSockets sólo dependería de la compatibilidad del cliente, porque el escenario del servidor lo puedes controlar tú.
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #3 (permalink)  
Antiguo 16/11/2011, 09:56
 
Fecha de Ingreso: noviembre-2007
Mensajes: 23
Antigüedad: 17 años
Puntos: 4
Respuesta: Comunicación Cliente-Servidor correcta

Cita:
Iniciado por maycolalvarez Ver Mensaje
1 - Ajax longpolling no consiste en enviar n peticiones x segundo, estás errado: el longpolling consiste en que el cliente envía una petición ajax y el server la mantiene abierta hasta un nuevo evento, obviamente cuando el server contesta se cumple el ciclo HTTP y se cierra la conexión, es allí donde el cliente vuelve a establecer otra petición AJAX, ¿ventajas?: que se reduce considerablemente el ancho de banda al mantener una conexión activa por más tiempo que es mejor que enviar n peticiones cada segundo, es una técnica muy utilizada por chats y se ha comprobado que es eficiente, sin embargo puede llegar a consumir mucho del servidor.
Posiblemente este equivocado con este tema ya que son muchas las versiones que me he encontrado. Efectivamente, tu versión según la teoría debería ser así, pero no lo es en la práctica. Utilizando la técnica de Long-Polling de Dojo, por ejemplo, se establece un intervalo de tiempo, en en el cada "X" segundos realiza la petición de "Y" datos. Si comprobamos las trazas de red, veremos que cada "X" segundos se ha vuelto a solicitar el fichero o información determinados. Por ello, para los chats actuales se utilizan otras tecnologías de Push del servidor.


Cita:
Iniciado por maycolalvarez Ver Mensaje
2 - "el servidor no estará siempre encendido": entonces No es un servidor, además un servidor bien configurado puede reiniciarse a consecuencia de fallas de energía, con respecto a node.js puedes hacer que se ejecute automáticamente al iniciar el OS, además de que existen muchas técnicas para prevenciones de caídas de servicios como virtualización, balance de carga o dispositivos para servidores de alta disponibilidad; así que usar WebSockets sólo dependería de la compatibilidad del cliente, porque el escenario del servidor lo puedes controlar tú.
No se trata de una aplicación/web para el público general, sino para un uso privado en empresas. Es por ello que no se cuenta con un servidor al que se conectan los clientes, sino que el propio servidor hace de cliente. Esto me hace querer evitar al máximo todo lo que haya que tocar del servidor, ya que estamos hablando de preparar mucha cantidad de servidores funcionales lo más rápido posible, y que serán manipulados a diario por personas ajenas. El equipo, a ojos del cliente, debe ser un equipo normal, con sus programitas y sus historias.
  #4 (permalink)  
Antiguo 16/11/2011, 10:04
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 16 años, 3 meses
Puntos: 1532
Respuesta: Comunicación Cliente-Servidor correcta

1 - esa será la forma de DOJO, pero en la mayoría que he visto es como te comente, y por supuesto que algunas tecnologías Push son más eficientes, pero se basan en el mismo concepto; solo quería aclararte que el longpolling no es igual a un ajax polling tradicional
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #5 (permalink)  
Antiguo 16/11/2011, 10:13
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Comunicación Cliente-Servidor correcta

Creo cualquier solución que llegues a encontrar usando push, vas a tener que descartar el uso de Apache, ya que Apache no es un servidor web preparado para push, su tecnología es distinta.

Hace poco encontre una lista de los servidores más usados para Comet (Push) y encontré esta lista: http://cometdaily.com/maturity.html Puedes evaluar cualquiera de esas opciones e intentar implementarla.

Saludos.

Etiquetas: apache, comet, cometd, html5, long-polling, pywebsocket, websocket
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:50.