2012-05-06 21 views
5

Voy a desarrollar un marco para la programación de cometas, y no puedo usar Web Sockets o Eventos enviados por el servidor (porque el soporte del navegador realmente apesta). Entonces, necesito mantener viva la conexión HTTP y enviar datos fragmentados al cliente.¿Cuál es la magia detrás de Lightstreamer?

Sin embargo, los problemas se manifiestan a medida que entra en la obra:

  1. El uso de XMLHttpRequest no es posible, debido al hecho de que el IE no le da xhr.responseText mientras que el xhr.readyState es
  2. 3. Un
  3. oculto iframe no puede ser útil, porque el navegador muestra el cargador mientras envío datos al cliente.
  4. Intenté enviar un archivo JavaScript de vuelta al cliente, enviando comandos de ejecución de funciones cada vez, pero los navegadores no ejecutarán JavaScript hasta que esté completamente cargado.

Sin embargo, cuando miro a Lightstreamer demo page, veo que envía un archivo JavaScript de vuelta al cliente poco a poco y en cada paso, se envía una llamada a la función y que la función simplemente es ejecutado (lo que pueda no hagas esta parte). Parece que Lightstreamer usa AJAX, ya que la solicitud simplemente aparece en la pestaña de la consola de Firebug, pero también funciona como un encanto en IE.

Traté de usar todos los campos de encabezado HTTP que establecieron en su solicitud, y no produjo ningún resultado. También intenté usar HTTP Post en lugar de HTTP Get, pero aún así no obtuve ningún resultado.

He leído casi más de 20 artículos sobre la forma de aplicar el cometa, pero ninguno of'em aparezco para resolver problemas que tengo:

  1. Cómo hacer que a través del navegador?
  2. Cómo recibir notificaciones cuando lleguen nuevos datos del servidor (¿en qué evento debo conectarme?)
  3. ¿Cómo hacer que mi página aparezca como completamente cargada para el usuario (cómo implementarla, para que el navegador no muestre actividad de carga)?

¿Alguien por favor ayuda? Creo que debería haber una pequeña propina o truco que no sé aquí para unir todos los conceptos. ¿Alguien sabe lo que Lightstreamer hace para superar estos problemas?

Respuesta

3

pero los navegadores no ejecutarán JavaScript hasta que esté completamente cargado.

¿Has intentado devolver el código envuelto en <script> etiquetas? Por ejemplo, en lugar de:

<script type="text/javascript"> 
f(...data1...); 
f(...data2...); 

tratar

<script type="text/javascript">f(...data1...);</script> 
<script type="text/javascript">f(...data2...);</script> 
+0

Sí, lo probé, pero solo funciona si configura el tipo MIME en * text/html *. En otras palabras, debe solicitar otro documento HTML. Si configura la respuesta a ** application/javascript ** o ** application/x-javascript ** o ** text/javascript **, no funcionará. Además, no resuelve mis problemas. Puedo usar XMLHttpRequest para solicitar un archivo HTML que contenga fragmentos de JavaScript. Sin embargo, no funciona en IE. Podría usar 'iframe', pero muestra el cargador. Lightstreamer funciona en todas partes y no muestra el signo del cargador. –

+0

También tenga en cuenta que si uso 'XMLHttpRequest' para obtener un archivo HTML siempre cargado que contenga' 'Fragmentos de JavaScript, no se ejecutarán. Quiero decir, el navegador ejecuta el código JavaScript dentro de las etiquetas JavaScript a medida que llegan, pero solo en solicitudes normales, no en solicitudes ajax. –

1

La mejor opción en su caso sería utilizar JSONP + larga tira en el lado del servidor. Solo tienes que recordar volver a conectar cualquier conexión de tiempo que se caiga (agote el tiempo de espera) o recibirás una respuesta.

código de ejemplo de jQuery:

function myJSONP(){ 
    $.getScript(url, { 
     success: function(){ 
      myJSONP(); //re-connect 
     }, 
     failure: function(){ 
      myJSONP(); //re-connect 
     } 
    }) 
} 

Obviamente su respuesta desde el servidor tiene que ser código javascript que llamará en sus funciones globales.

Alternativamente, puede utilizar algún plugin jquery JSONP.

O echar un vistazo en este proyecto http://www.meteor.com/ (genial, pero no lo probamos)

+0

No quiero hacer ** una conexión (solicitud) por actualización **. Necesito abrir solo una conexión y actualizar el navegador del cliente a través de esa única conexión. Ver el enlace en mi pregunta y examinarlo en Firebug. –

4

Los métodos que desea es el streaming.

¿Cómo hacer esto cross-browser?

Considerando la mayoría de los navegadores, no hay una forma consistente. Debes elegir un transporte adecuado según el navegador. Peor aún, debe confiar en el rastreo del navegador para reconocer qué navegador se está utilizando y la detección de características no cuenta para nada. Puede usar XDomainRequest para IE8 +, XMLHttpRequest para no IE y Iframe para IE 6+. Evite el transporte de iframe si es posible.

Cómo recibir notificaciones cuando lleguen nuevos datos desde el servidor (¿en qué evento debo conectarme?)

Esto varía de acuerdo con el transporte utilizado. Por ejemplo, XDomainRequest activa el evento de progreso, XMLHttpRequest activa el evento readystatechange cuando se llega al fragmento, excepto Opera e IE.

¿Cómo hacer que mi página aparezca como completamente cargada para el usuario (cómo implementarla, para que el navegador no muestre actividad de carga)?

No conozco este problema con iframe, pero todavía ocurre en los navegadores basados ​​en WebKit como Chrome y Safari con XMLHttpRequest. La única manera de evitar esto es conectarse después del evento onload de la ventana, pero, en el caso de Safari, esto no funciona.

Hay algunos problemas que debe tener en cuenta además de las preguntas anteriores.

  1. Servidor controlado por eventos: el servidor debe poder procesar de forma asincrónica.
  2. Requisitos de transporte: el servidor se comporta de manera diferente para el transporte requerido.
  3. Formato de secuencia: si el servidor va a enviar mensajes grandes o múltiples en un solo fragmento, un solo fragmento no significa un solo dato. Podría ser un fragmento de un solo dato o una concatenación de datos múltiples. Para reconocer qué son los datos, la respuesta debe formatearse.
  4. Manejo de errores: el transporte de iframe no proporciona ninguna evidencia de desconexión.
  5. ...

Por último, pero no menos importante, para poner en práctica el streaming es bastante tedioso de lo que parece a diferencia de sondeo largo. Recomiendo que utilice un marco sólido para hacerlo, como socketio, sockjs y jquery socket que he creado y administrado.

Buena suerte.

5

SockJS autor aquí.

  • ¿Cómo hacer esto cross-browser?

Esto es duro, espera tener que pasar unos meses en conseguir el streaming transporta en la ópera y el IE.

  • Cómo ser notificado cuando se llega nuevos datos desde el servidor (qué evento debería engancharse a)?

Existen varias técnicas, dependiendo de un navegador en particular. Para una buena introducción, eche un vistazo a los diferentes protocolos de respaldo compatibles con Socket.IO y SockJS.

  • Cómo hacer que mi página aparecen como totalmente cargado al usuario (la manera de ponerla en práctica, por lo que el navegador no muestra la actividad de carga)?

Nuevamente, hay trucos específicos del navegador. Una es retrasar la carga de AJAX después del evento de carga. Otro es vincular y desvincular un iframe de DOM. ETC. Si todavía te interesa, lee el código SockJS o Socket.io.

¿Alguien por favor ayuda? Creo que debería haber una pequeña propina o truco que no sé aquí para unir todos los conceptos. ¿Alguien sabe lo que Lightstreamer hace para superar estos problemas?

Básicamente, a menos que tenga una razón muy fuerte para hacerlo, no reinvente la rueda. Use SockJS, Socket.io, faye o cualquier otro de docenas de proyectos que ya resuelvan este problema.

+0

Marek, la pregunta es "¿Qué es la magia en lightstreamer"? ¿Estás diciendo que SockJS o tal es la magia? (por ejemplo, que no necesitamos Lightstreamer porque SockJS maneja el cliente JS multiplataforma)? ¿Qué pasa con el servidor lightstreamer, hace magia? – Jonesome

+0

Pregunto por esta pregunta: http://stackoverflow.com/questions/19667644/level-of-difficulty-to-recreate-lightstreamer-server-and-three-client-pieces – Jonesome

Cuestiones relacionadas