2012-05-06 21 views
5

Svilupperò un framework per la programmazione delle comete e non posso utilizzare Web Sockets o Server-Sent Events (perché il supporto del browser fa davvero schifo). Quindi, ho bisogno di mantenere la connessione HTTP attiva e di inviare i dati chunked al client.Qual è la magia dietro Lightstreamer?

Tuttavia, i problemi si mostrano come si ottiene nel lavoro:

  1. Utilizzando XMLHttpRequest non è possibile, a causa del fatto che IE non ti dà xhr.responseText mentre il xhr.readyState è 3.
  2. A nascosto iframe non può essere utile, perché il browser mostra il caricatore mentre invio i dati al client.
  3. Ho provato a inviare un file JavaScript al client, inviando ogni volta i comandi di esecuzione della funzione, ma i browser non eseguiranno JavaScript finché non sarà completamente caricato.

Tuttavia, quando guardo Lightstreamer demo page, vedo che invia un file JavaScript al client poco a poco e in ogni passaggio, invia una chiamata alla funzione e semplicemente viene eseguito quella funzione (posso fare questa parte). Sembra che Lightstreamer usi AJAX, dal momento che la richiesta viene semplicemente visualizzata nella scheda della console di Firebug, ma funziona anche come un fascino in IE.

Ho provato a utilizzare ogni campo di intestazione HTTP che hanno impostato sulla loro richiesta e nessun risultato. Ho anche provato a utilizzare HTTP Post invece di HTTP Get, ma non ho ancora ottenuto alcun risultato.

Ho letto quasi più di 20 articoli su come implementare cometa, ma nessuno of'em appaio per risolvere i problemi che ho:

  1. Come per renderlo cross-browser?
  2. Come ricevere una notifica quando arrivano nuovi dati dal server (quale evento dovrei collegare)?
  3. Come rendere la mia pagina visualizzata come completamente caricata per l'utente (come implementarla, in modo che il browser non mostri l'attività di caricamento)?

Qualcuno può aiutare per favore? Penso che ci dovrebbe essere un piccolo consiglio o trucco che non conosco qui per incollare tutti i concetti insieme. Qualcuno sa cosa fa il lightstreamer per superare questi problemi?

risposta

3

ma i browser non eseguiranno JavaScript finché non sarà completamente caricato.

Hai provato a inviare il codice inserito nei tag <script>? Per esempio, invece di:

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

provare

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

Sì, l'ho provato, ma funziona solo se si imposta il tipo MIME su * text/html *. In altre parole, dovresti richiedere un altro documento HTML. Se si imposta la risposta su ** application/javascript ** o ** application/x-javascript ** o ** text/javascript **, non funzionerà. Inoltre non risolve i miei problemi. Posso usare XMLHttpRequest per richiedere un file HTML contenente snippet JavaScript. Tuttavia, non funziona in IE. Potrei usare 'iframe', ma mostra loader. Lightstreamer funziona ovunque e non mostra il segno del caricatore. –

+0

Si noti inoltre che se utilizzo 'XMLHttpRequest' per ottenere un file HTML sempre carico che contiene l'avviso' 'snippet JavaScript, non verranno eseguiti. Voglio dire, il browser esegue il codice JavaScript all'interno dei tag JavaScript non appena arrivano, ma solo nelle richieste normali, non nelle richieste Ajax. –

1

L'opzione migliore nel tuo caso sarebbe quella di utilizzare JSONP + lungo Tirando lato server. Devi solo ricordarti di riconnettere qualsiasi goccia di connessione (timeout) o ricevere risposta.

codice di esempio in jQuery:

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

Ovviamente la risposta dal server deve essere codice javascript che chiamerà su delle vostre funzioni globali.

In alternativa è possibile utilizzare un plugin JSONP jQuery.

Oppure dare un'occhiata a questo progetto http://www.meteor.com/ (davvero cool, ma non provate)

+0

Non voglio fare ** una connessione (richiesta) per aggiornamento **. Devo aprire solo una connessione e aggiornare il browser del client tramite quella singola connessione. Vedi il link nella mia domanda ed esaminalo in Firebug. –

4

I metodi che si desidera è la streaming.

Come renderlo cross-browser?

Considerando la maggior parte dei browser, non esiste un modo coerente. Devi scegliere un trasporto adeguato in base al browser. Ancora peggio, devi fare affidamento sul browser che sniffing per riconoscere quale browser viene utilizzato e il rilevamento delle funzionalità non conta nulla. È possibile utilizzare XDomainRequest per IE8 +, XMLHttpRequest per non-IE e Iframe per IE 6+. Evita il trasporto iframe se possibile.

Come ricevere una notifica quando arrivano nuovi dati dal server (quale evento dovrei collegare)?

Varia in base al trasporto utilizzato. Ad esempio, XDomainRequest fa scattare l'evento progress, XMLHttpRequest genera l'evento readystatechange quando arriva chunk, ad eccezione di Opera e IE.

Come rendere la mia pagina visualizzata come completamente caricata per l'utente (come implementarla, in modo che il browser non mostri l'attività di caricamento)?

Non conosco questo problema con iframe, ma si verifica ancora nei browser basati su WebKit come Chrome e Safari con XMLHttpRequest. L'unico modo per evitare ciò è connettersi dopo l'evento onload della finestra, ma, nel caso di Safari, questo non funziona.

Ci sono alcuni problemi che devi considerare oltre alle domande di cui sopra.

  1. Server basato su eventi: il server deve essere in grado di elaborare in modo asincrono.
  2. Requisiti di trasporto: il server si comporta in modo diverso per il trasporto richiesto.
  3. Formato streaming: se il server invia messaggi di grandi dimensioni o più messaggi in un singolo blocco, un singolo blocco non significa un singolo dato. Potrebbe essere frammento di un singolo dato o concatenazione di più dati. Per riconoscere quali sono i dati, la risposta dovrebbe essere formattata.
  4. Gestione degli errori: il trasporto di Iframe non fornisce alcuna prova per la disconnessione.
  5. ...

Ultimo ma non meno, per implementare lo streaming è piuttosto faticoso di quello che sembra a differenza di polling lungo. Vi consiglio di utilizzare una solida struttura per fare ciò come socketio, sockjs e jquery socket che ho creato e gestito.

Buona fortuna.

5

Autore SockJS qui.

  • Come renderlo cross-browser?

Questo è difficile, si aspettano per trascorrere un paio di mesi su come ottenere lo streaming trasporta su Opera e IE.

  • Come per essere avvisato quando nuovi dati vengono arrivato dal server (quale evento dovrei collegare in)?

Esistono varie tecniche, a seconda di un particolare browser. Per una buona introduzione dare un'occhiata ai diversi protocolli di fallback supportati da Socket.IO e SockJS.

  • Come rendere la mia pagina appaiono come completamente caricato per l'utente (come implementare, in modo che il browser non mostra l'attività di carico)?

Ancora, ci sono trucchi specifici del browser. Uno è di ritardare il caricamento di AJAX dopo l'evento onload. Altro è quello di legare e separare un iframe dal DOM. ECCETERA. Se ti senti ancora interessato leggi il codice SockJS o Socket.io.

Qualcuno può aiutare? Penso che ci dovrebbe essere un piccolo consiglio o trucco che non conosco qui per incollare tutti i concetti insieme. Qualcuno sa cosa fa il lightstreamer per superare questi problemi?

Fondamentalmente, a meno che non si abbia una ragione molto forte, non reinventare la ruota. Usa SockJS, Socket.io, faye, o qualsiasi altro dei dozzine di progetti che risolvono già questo problema.

+0

Marek, la domanda è "Qual è la magia nel lightstreamer" - stai dicendo che SockJS o tale è la magia? (ad esempio, non abbiamo bisogno di Lightstreamer perché SockJS gestisce il client JS multipiattaforma)? Che mi dici del server di Lightstreamer, fa magia? – Jonesome

+0

Sto chiedendo a causa di questa domanda: http://stackoverflow.com/questions/19667644/level-of-difficulty-to-recreate-lightstreamer-server-and-three-client-peeces – Jonesome

Problemi correlati