Mendorong data dari Server ke Klien tanpa permintaan klien?

11

Saya perhatikan saat menjelajah Stack Exchange bahwa ada pemberitahuan dinamis seperti "3 pesan baru, klik untuk menunjukkan". Saya ingin memiliki semacam pembaruan dinamis untuk apa yang akan saya jelaskan.

Katakanlah saya ingin membuat korsel / rangkai salindia dari 10 artikel berita terbaru. Saya ingin korsel ini diperbarui setiap jam, dalam antrian. Artikel yang lebih baru akan mendorong artikel lama keluar dari antrian. Solusi dari atas kepala saya akan menjadi.

  1. Pengguna masuk ke klien.
  2. Klien menghitung # menit hingga tanda jam berikutnya dan menetapkan timer untuk dieksekusi pada jam tersebut.
  3. Pada jam tanda, kirim permintaan ke server tentang artikel berita baru yang belum ada di komidi putar.
  4. Tangani respons.
  5. Setel ulang pengatur waktu.

Apakah ini strategi yang dapat diterima? Bisakah saya mencapai ini tanpa mengandalkan permintaan klien? Dengan kata lain bagaimana Stack Exchange mencapai pembaruan dinamisnya?

Eric Guan
sumber
4
Lihatlah SignalR.
Robert Harvey
Saya sarankan Anda membaca di RSS dan AJAX untuk ide. RSS adalah contoh protokol standar untuk feed berlangganan, dan AJAX adalah konsep tingkat tinggi untuk cara memperbarui klien (browser) tanpa memuat ulang halaman. Saya berani bertaruh inilah cara kerja Stack Exchange.
1
@Snowman Stack Exchange menggunakan WebSocket. Lihat meta.stackexchange.com/questions/10369/...
Robert Harvey
Apakah klien itu peramban, klien khusus, atau lainnya?
outis
Ini agak permusuhan dari pengguna, tetapi Anda bisa membuat halaman HTML me-refresh sendiri setiap 15 menit atau lebih. Sebagian besar halaman web berita melakukan ini.
Gilbert Le Blanc

Jawaban:

7

Untuk mendorong data, Anda harus mengidentifikasi Klien, dan itu akan dilakukan dengan berlangganan klien ke server. Setelah selesai, Anda akan memiliki daftar klien berlangganan dengan koneksi persisten.

Bergantung pada apa yang ingin Anda capai, saya akan mengatakan yang terbaik bagi klien untuk meminta ke server, sehingga Anda tidak harus mempertahankan koneksi yang terus-menerus dan memanfaatkan protokol komunikasi permintaan / respons sebagai HTTP.

Salah satu contoh yang muncul dalam pikiran untuk menjaga koneksi tetap akan menjadi live chat / sistem pesan instan, karena komunikasi harus terjadi secara real time.

Perlu diingat bahwa koneksi persisten biasanya diimplementasikan melalui penggunaan sockets, yang menambahkan overlay dalam mengimplementasikan protokol komunikasi Anda sendiri, enkripsi, dll ...

Christopher Francisco
sumber
2

Pada dasarnya Anda perlu mendorong data ke klien, dan karena komunikasi dua arah tidak dalam lingkup protokol http, tidak mudah untuk mengimplementasikannya sendiri.

Solusi masalah Anda adalah socket.io

Seperti yang dinyatakan oleh situs webnya,

"Socket.IO memungkinkan komunikasi berbasis peristiwa dua arah secara real-time. Ia berfungsi pada setiap platform, browser, atau perangkat, dengan fokus yang sama pada keandalan dan kecepatan."

Semoga ini akan menyelesaikan masalah Anda.

Alok Saini
sumber
7
Akan sangat membantu, jika Anda menyatakan jika dan bagaimana Anda berafiliasi dengan socket.io dan bagaimana hal itu akan membantu memecahkan masalah kuesioner berdasarkan pengetahuan / pengalaman Anda dengan kerangka kerja (berbeda dengan "pernyataan misi" dari situs web)
Benni
WebSockets lebih disukai daripada Socket.IO sekarang karena semua browser utama menerapkan standar. Sebagian besar bahasa utama memiliki implementasi websocket, tetapi tidak yang socket.io. Socket.io menambahkan struktur tambahan ke pesan, sehingga tidak mudah kompatibel.
Alex Reinking
1

Saya tidak dapat berbicara bagaimana SE melakukannya meskipun karena ini adalah situs web ada beberapa cara yang bisa mereka lakukan yang dapat mencakup pekerjaan cron diatur untuk menjalankan skrip php / asp / what-have-you pada jam untuk mendorong data. Tapi ini akan terjadi jika Anda mencari solusi hanya web.

Tetapi karena Anda menyebutkan klien, Anda mungkin bisa membuat file dengan tanggal / waktu pembaruan berita terbaru untuk klien itu dan meminta klien memeriksa nilai yang disimpan dalam file tersebut dan membandingkannya dengan waktu sistem pengguna untuk melihat apakah satu jam telah berlalu sejak pembaruan terakhir. Jika sudah setidaknya satu jam maka klien meminta aliran berita terbaru dari server Anda yang kemudian mengembalikan aliran berita terbaru ke klien.

Saya akan menghindari menggunakan timer atau setidaknya menggunakan timer hanya karena metode itu hanya akan bekerja jika pengguna membuat klien tetap terbuka untuk menjaga timer berjalan. Tetapi jika Anda (juga) memiliki file seperti yang saya sarankan maka Anda dapat membuat subrutin untuk membuka file, menyimpan waktu menjadi variabel dan membandingkannya dengan waktu sistem dan membuat permintaan jika telah setidaknya satu jam. Maka Anda cukup menelepon ke sub terkait dengan peristiwa tertentu. Saya pasti akan menyebutnya pada formulir memuat karena jika pengguna hanya me-restart klien mereka maka Anda ingin berita terbaru. Jika sudah beberapa hari sejak mereka berada di klien maka itu akan menampilkan berita setua itu. Paling tidak mengikat sub itu untuk memuat klien dan memulai timer seperti yang Anda sarankan.

Saya minta maaf jika saya salah mengerti apa yang Anda inginkan karena saya tidak sepenuhnya yakin apa yang Anda inginkan. Tapi semoga bagaimanapun ada sesuatu yang berharga di sini untuk Anda!

WeekendRockstar
sumber