Spingendo i dati dal server al client senza una richiesta del cliente?

9

Ho notato durante la navigazione in Stack Exchange che ci sono notifiche dinamiche come "3 nuovi messaggi, clicca per mostrare". Voglio avere questo tipo di aggiornamento dinamico per quello che sto per spiegare.

Diciamo che voglio creare un carosello / presentazione di 10 articoli di notizie recenti. Voglio che questo carosello venga aggiornato ogni ora, in coda. I nuovi articoli spingeranno gli articoli più vecchi fuori dalla coda. La soluzione dalla mia testa sarebbe.

  1. L'utente accede al client.
  2. Il cliente calcola il numero di minuti fino all'indicazione della prossima ora e imposta un timer da eseguire all'ora.
  3. All'ora, invia una richiesta al server di qualsiasi nuovo articolo di notizie che non sia già presente nel carosello.
  4. Gestisci la risposta.
  5. Ripristina timer.

Questa è una strategia accettabile? Posso ottenere questo risultato senza fare affidamento sulle richieste dei clienti? In altre parole, come Stack Exchange raggiunge il suo aggiornamento dinamico?

    
posta Eric Guan 14.07.2015 - 03:09
fonte

3 risposte

6

Per spingere i dati, dovresti identificare un cliente, e ciò sarebbe fatto iscrivendo il client al server. Una volta fatto, avresti un elenco di client sottoscritti con una connessione permanente.

A seconda di ciò che si desidera ottenere, direi che è meglio che il client richieda al server, in modo da non dover mantenere una connessione persistente e utilizzare i protocolli di comunicazione richiesta / risposta come HTTP.

Un esempio che viene in mente per mantenere una connessione persistente sarebbe un sistema di chat / instant messaging dal vivo, poiché la comunicazione dovrebbe avvenire in tempo reale.

Ricorda che la connessione persistente di solito viene implementata tramite l'utilizzo di sockets , che aggiunge una sovrapposizione nell'implementazione del tuo protocollo di comunicazione, crittografia, ecc ...

    
risposta data 14.07.2015 - 05:41
fonte
1

Non posso parlare di come SE lo fa sebbene dal momento che si tratta di un sito Web ci sono diversi modi in cui potrebbero includere un job cron impostato per eseguire uno script php / asp / what-have-you all'ora per spingere i dati . Ma questo sarebbe se steste cercando una soluzione solo web.

Ma dal momento che stai citando un client potresti forse creare un file con la data / ora dell'ultimo aggiornamento di notizie a quel client e chiedere al client di controllare il valore memorizzato in tale file e confrontarlo con il tempo di sistema dell'utente per vedere se è trascorsa un'ora dall'ultimo aggiornamento. Se è trascorso almeno un'ora, il client richiede al flusso di notizie l'ultimo flusso di notizie dal tuo server, che poi restituisce il flusso di notizie più recente al client.

Eviterei di usare un timer o almeno di usare un timer solo perché quel metodo funzionerebbe solo se l'utente tiene aperto il client per mantenere attivo il timer. Ma se hai (anche) il file come suggerito, puoi creare una subroutine per aprire il file, memorizzare il tempo in una variabile e confrontarlo con l'ora del sistema ed effettuare la richiesta se è stata almeno un'ora. Quindi devi semplicemente effettuare chiamate al sub in relazione a determinati eventi. Definitivamente lo chiamerei su caricamento del modulo perché se l'utente sta solo riavviando il proprio client, allora vorrebbe le ultime notizie. Se fossero passati alcuni giorni da quando erano sul client, mostrerebbero le notizie così vecchie. Nel minor legame che subisce al cliente, carica e avvia il timer come hai suggerito. Teoricamente finché l'utente mantiene aperto il client, il timer continuerà a fare le sue cose e quindi si avrà il sottoprocesso a carico per quando non c'è un timer attivo per tenere traccia dei tempi.

Chiedo scusa se ho frainteso quello che stavi cercando dato che non sono completamente sicuro di quello che stai cercando. Ma spero comunque che ci sia qualcosa di valore qui per te!

    
risposta data 14.07.2015 - 03:52
fonte
1

Fondamentalmente è necessario inviare dati al client e, poiché una comunicazione bidirezionale non è nell'ambito del protocollo http, non è facile da implementare da sola.

La soluzione del tuo problema è socket.io

Come afferma il suo sito web,

"Socket.IO consente la comunicazione bidirezionale basata sugli eventi in tempo reale. Funziona su ogni piattaforma, browser o dispositivo, concentrandosi in egual misura su affidabilità e velocità. "

Spero che questo risolva il tuo problema.

    
risposta data 14.07.2015 - 08:11
fonte

Leggi altre domande sui tag