C'è un modo per PUSH i dati dal web server al browser?


134

Naturalmente sono a conoscenza di Ajax, ma il problema con Ajax è che il browser dovrebbe eseguire il polling frequente del server per scoprire se ci sono nuovi dati. Ciò aumenta il carico del server.

Esiste un metodo migliore (anche utilizzando Ajax) diverso dal polling frequente del server?


1
Non sono sicuro che ci sia. Per renderlo concettualmente più semplice per l'applicazione, immagino che potresti implementare un livello di trasporto in cima alle richieste di polling, rimuovendo così la responsabilità di polling dalla logica dell'applicazione. Forse qualcuno l'ha già implementato? <strong> Modifica: </strong> apparentemente si chiama <a href=" en.wikipedia.org/wiki/Reverse_Ajax"> Ajax inversa </a> e <a href = " en.wikipedia.org/wiki/Comet_ ( programmazione) "> Cometa </ ​​a >, ma finora sembra che tu debba implementarlo da solo. Una libreria JavaScript per questo, chiunque?
Anders Sandvig,

1
@ Rachel - Aggiornamenti live in modo da poter vedere cosa stanno facendo gli altri. Buono per siti come StackOverflow e per applicazioni Web per la collaborazione come i documenti di Google.
Itai Bar-Haim,

1
Chiunque faccia questo genere di cose nel 2016 probabilmente troverebbe i websocket una scelta migliore per questo tipo di comunicazione.
Shadow

Risposte:



37

Sì, si chiama Reverse Ajax o Comet . Cometa è fondamentalmente un termine generico per diversi modi di aprire richieste HTTP di lunga durata al fine di trasferire i dati in tempo reale a un browser web. Consiglierei StreamHub Push Server , hanno alcune dimostrazioni interessanti ed è molto più facile iniziare con qualsiasi altro server. Controlla per la Guida introduttiva di Comet e StreamHub Tutorial per una rapida introduzione. È possibile utilizzare la Community Edition che è disponibile per il download gratuito ma è limitata a 20 utenti simultanei. La versione commerciale è valsa la pena solo per il supporto, inoltre si ottengono adattatori client SSL e Desktop .NET e Java. La guida è disponibile tramite il Gruppo Google , c'è un buon gruppo di tutorial in rete e c'è un adattatore di GWT Comet troppo.


1
Sicuramente la strada da percorrere, una volta che hai iniziato a implementarlo da solo ti rendi conto di quanto c'è da fare - riconnessione, polling lungo, streaming iframe, supporto cross-browser, HTTPS ...
Corehpf

2
Una spiegazione di cometa aiuterebbe questa risposta
Kevin Monk,

1
@Satir: aggiunta una breve spiegazione. Altre risposte hanno collegamenti all'articolo Wikipedia.
Nosrama,

32

Al giorno d'oggi dovresti usare WebSocket. Questo è lo standard del 2011 che consente di avviare connessioni con HTTP e quindi di aggiornarle alla comunicazione bidirezionale basata su messaggi client-server.

Puoi avviare facilmente la connessione da javascript:

var ws = new WebSocket("ws://your.domain.com/somePathIfYouNeed?args=any");
ws.onmessage = function (evt) 
{
  var message = evt.data;
  //decode message (with JSON or something) and do the needed
};

La gestione lato server dipende dalla pila di tenchnology.



8
Sono totalmente d'accordo ... L'uso dell'HTTP per la comunicazione bidirezionale è come pensare nelle chiamate REST per far saltare Mario sui gusci di tartaruga ... è follia. Non è NECESSARIO effettuare richieste e attendere risposte per il semplice pulsante che spinge le persone .... Semplicemente no. HTTP è un protocollo di documento. Protocollo di trasferimento Hyper TEXT. Ajax Push è un modo follemente complesso per aggirare HTTP per fare ciò che WebSocket fa di progettazione. Smetti di essere sciocco e usa lo strumento giusto per il lavoro.
Nick Steele,

ti piacciono molto le ellissi, e talvolta una nuova forma di quattro punti che chiamerò "ellissi"!
imbatman,

10

Esaminare la cometa (una parodia del fatto che l'Ajax è un detergente e così anche la cometa) che è sostanzialmente "invertire l'Ajax". Tieni presente che ciò richiede una connessione al server di lunga durata per ogni utente per ricevere notifiche, quindi fai attenzione alle implicazioni sulle prestazioni quando scrivi la tua app.

http://en.wikipedia.org/wiki/Comet_(programming)



5

Consiglio vivamente di investire un po 'di tempo su Comet, ma non conosco una vera implementazione o libreria che potresti usare.

Per una sorta di "pannello di controllo del callcenter" di un'app Web che prevedeva l'aggiornamento dell'agente e lo stato della coda delle chiamate per un Callcenter live, abbiamo sviluppato una soluzione interna che funziona, ma è lontana da una libreria che è possibile utilizzare.

Quello che abbiamo fatto è stato implementare un piccolo servizio sul server che parla al sistema telefonico, attende nuovi eventi e mantiene una fotografia della situazione. Questo servizio fornisce un piccolo server web.

I nostri client Web si connettono tramite HTTP a questo server Web e chiedono l'ultima foto (codificata in XML), la visualizzano e poi vanno di nuovo, chiedendo la nuova foto. Il server web a questo punto può:

  • Restituisci la nuova foto, se ce n'è una
  • Blocca il client per alcuni secondi (30 nella nostra configurazione) in attesa che si verifichi un evento e cambi la fotografia. Se nessun evento è stato generato a quel punto, restituisce la stessa foto, solo per consentire alla connessione di rimanere in vita e non timeout del client.

In questo modo, quando i client eseguono il polling, ottiene una risposta entro 0-30 secondi al massimo. Se un nuovo evento è già stato generato, lo ottiene immediatamente), altrimenti si blocca fino a quando non viene generato un nuovo evento.

Fondamentalmente è il polling, ma è un po 'intelligente polling per non surriscaldare il server web. Se Comet non è la tua risposta, sono sicuro che questo potrebbe essere implementato usando la stessa idea, ma utilizzando AJAX in modo più ampio o codificando in JSON per risultati migliori. Questo è stato progettato nell'era pre-AJAX, quindi ci sono molti margini di miglioramento.

Se qualcuno è in grado di fornire un'implementazione leggera di questo, fantastico!


5

Un'alternativa interessante alla cometa è usare i socket in Flash.




2

Esistono altri metodi. Non sono sicuro che siano "migliori" nella tua situazione. È possibile disporre di un'applet Java che si connette al server al caricamento della pagina e in attesa di invio di materiale dal server. Sarebbe un po 'più lento all'avvio, ma consentirebbe al browser di ricevere dati dal server su una base rara, senza polling.


2

È possibile utilizzare un'applicazione Flash / Flex sul client con BlazeDS o LiveCycle sul lato server. I dati possono essere inviati al client utilizzando una connessione RTMP. Tenere presente che RTMP utilizza una porta non standard. Ma puoi facilmente ricorrere al polling se la porta è bloccata.


2

È possibile raggiungere ciò a cui stai mirando attraverso l'uso di connessioni HTTP persistenti.

Dai un'occhiata all'articolo di Comet su wikipedia, è un buon punto di partenza.

Non stai fornendo molte informazioni ma se stai cercando di costruire una sorta di sito guidato dagli eventi (a'la digg spy) o qualcosa del genere, probabilmente stai cercando di implementare un IFRAME nascosto che si collega a un URL in cui la connessione non si chiude mai e quindi si spingeranno i tag di script dal server al client per eseguire gli aggiornamenti.



1

Una volta aperta una connessione al server, può essere mantenuta aperta e il server può spingere il contenuto molto tempo fa ho fatto con l'utilizzo, multipart/x-mixed-replacema questo non ha funzionato in IE.

Penso che puoi fare cose intelligenti con il polling che lo fa funzionare più come spingere non inviando intestazioni invariate di contenuto ma lasciando aperta la connessione ma non l'ho mai fatto.





Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.