Invio di dati dal server al client senza una richiesta client?


11

Durante la navigazione con Stack Exchange ho notato che ci sono notifiche dinamiche come "3 nuovi messaggi, fai clic 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 questa giostra sia aggiornata ogni ora, in coda. Gli articoli più recenti spingono gli articoli più vecchi fuori dalla coda. La soluzione sarebbe stata la mia cima.

  1. L'utente accede al client.
  2. Il client calcola il numero di minuti fino all'ora successiva e imposta un timer da eseguire all'ora.
  3. All'ora, invia una richiesta al server su eventuali nuovi articoli di notizie che non sono già stati nella giostra.
  4. Gestire la risposta.
  5. Ripristina timer.

È una strategia accettabile? Posso raggiungere questo obiettivo senza fare affidamento sulle richieste dei clienti? In altre parole, in che modo Stack Exchange ottiene il suo aggiornamento dinamico?


4
Dai un'occhiata a SignalR.
Robert Harvey,

Ti consiglio di leggere su RSS e AJAX per idee. RSS è un esempio di protocollo standard per i feed di abbonamento e AJAX è un concetto di alto livello su come aggiornare un client (browser) senza ricaricare la pagina. Scommetto che funziona così Stack Stack.


Il client è un browser, un client personalizzato o qualcos'altro?
uscita

È alquanto ostile all'utente, ma potresti far aggiornare la pagina HTML ogni 15 minuti circa. La maggior parte delle pagine Web di notizie fa questo.
Gilbert Le Blanc,

Risposte:


7

Al fine di inviare i dati, dovresti identificare un client, e ciò avverrebbe sottoscrivendo il client al server. Una volta fatto, avresti un elenco di client abbonati con una connessione persistente.

A seconda di ciò che vuoi 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 live / instant messaging, poiché la comunicazione dovrebbe avvenire in tempo reale.

Tieni presente che la connessione persistente viene generalmente implementata mediante l'uso di sockets, che aggiunge un overlay nell'implementazione del tuo protocollo di comunicazione, crittografia, ecc ...


2

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

La soluzione del tuo problema è socket.io

Come afferma il suo sito Web,

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

Spero che questo risolva il tuo problema.


7
Sarebbe utile se affermassi se e come sei affiliato a socket.io e come ti aiuterà a risolvere il problema degli interroganti in base alla tua conoscenza / esperienza con il framework (in contrasto con una semplice "dichiarazione di missione" del sito Web)
Benni,

WebSocket è strettamente preferibile a Socket.IO ora che tutti i principali browser implementano lo standard. La maggior parte dei linguaggi principali ha implementazioni di websocket, ma non di socket.io. Socket.io aggiunge ulteriore struttura ai messaggi, quindi non è prontamente compatibile.
Alex Reinking,

1

Non posso parlare di come lo fa SE, sebbene sia un sito web ci sono diversi modi in cui potrebbero includere un lavoro cron impostato per eseguire uno script php / asp / what-have-you all'ora per inviare i dati. Ma questo sarebbe se stavi cercando una soluzione solo web.

Ma dal momento che stai menzionando un client potresti forse creare un file con la data / ora dell'ultimo aggiornamento delle notizie a quel client e fare in modo che il client controlli il valore memorizzato in quel file e confrontalo con l'ora di sistema dell'utente per vedere se un'ora è passato dall'ultimo aggiornamento. Se è passata almeno un'ora, il client richiede l'ultimo flusso di notizie dal server che restituisce al client l'ultimo flusso di notizie.

Eviterei di usare un timer o almeno di usare un timer solo perché quel metodo funzionerebbe solo se l'utente mantiene il client aperto per mantenere il timer in esecuzione. Ma se (anche) hai il file come ti ho suggerito, puoi creare una subroutine per aprire il file, archiviare l'ora in una variabile e confrontarla con l'ora di sistema ed effettuare la richiesta se è stata almeno un'ora. Quindi fai semplicemente chiamate al sub in relazione a determinati eventi. Lo chiamerei sicuramente al caricamento del modulo perché se l'utente sta semplicemente riavviando il proprio client, vorresti le ultime notizie. Se fossero passati alcuni giorni da quando erano sul client, avrebbe mostrato notizie così vecchie. In ultima analisi, collega il sub al caricamento del client e avvia il timer come suggerito.

Mi scuso se ho frainteso quello che stavi cercando, poiché non sono del tutto sicuro di quello che stai cercando. Ma spero che in entrambi i casi ci sia qualcosa di prezioso qui per te!

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.