Apakah ada cara untuk PUSH data dari server web ke browser?

134

Tentu saja saya tahu tentang Ajax, tetapi masalah dengan Ajax adalah browser harus sering memeriksa server untuk menemukan apakah ada data baru. Ini meningkatkan beban server.

Apakah ada metode yang lebih baik (bahkan menggunakan Ajax) selain sering melakukan polling ke server?

Niyaz
sumber
1
Saya tidak yakin ada. Untuk membuatnya lebih sederhana secara konseptual untuk aplikasi, saya kira Anda dapat mengimplementasikan lapisan transport di atas permintaan polling, dan dengan demikian menghilangkan tanggung jawab polling dari logika aplikasi Anda. Mungkin seseorang bahkan sudah menerapkan ini? <strong> Edit: </strong> Rupanya disebut <a href=" en.wikipedia.org/wiki/Reverse_Ajax"> Ajax terbalik </a> dan <a href = " en.wikipedia.org/wiki/Comet_ ( programming) "> Comet </ a >, tapi sejauh ini sepertinya Anda harus mengimplementasikannya sendiri. Perpustakaan JavaScript untuk ini, siapa?
Anders Sandvig
1
@Rachel - Pembaruan langsung sehingga Anda dapat melihat apa yang dilakukan orang lain. Baik untuk situs seperti StackOverflow dan untuk aplikasi web untuk kolaborasi seperti dokumen Google.
Itai Bar-Haim
1
Siapa pun yang melakukan hal semacam ini di tahun 2016 mungkin akan menemukan websockets sebagai pilihan yang lebih baik untuk jenis komunikasi ini.
Bayangan

Jawaban:

37

Ya, ini disebut Reverse Ajax atau Comet . Comet pada dasarnya adalah istilah umum untuk berbagai cara membuka permintaan HTTP berumur panjang untuk mendorong data secara real-time ke browser web. Saya akan merekomendasikan StreamHub Push Server , mereka memiliki beberapa demo keren dan jauh lebih mudah untuk memulai daripada server lainnya. Lihat Tutorial Memulai Comet dan StreamHub untuk pengenalan singkat. Anda dapat menggunakan Edisi Komunitas yang tersedia untuk diunduh secara gratis tetapi terbatas untuk 20 pengguna bersamaan. Versi komersial sangat berharga untuk dukungan saja ditambah Anda mendapatkan adaptor klien SSL dan Desktop .NET & Java. Bantuan tersedia melalui Google Grup, ada banyak tutorial bagus di internet dan ada juga adaptor GWT Comet .

Nosrama
sumber
1
Jelas cara yang harus ditempuh, setelah Anda menerapkannya sendiri, Anda menyadari betapa banyak yang harus dilakukan - penyambungan ulang, polling panjang, streaming iframe, dukungan lintas-browser, HTTPS ...
Corehpf
2
Penjelasan tentang apa itu Komet akan membantu jawaban ini
Kevin Monk
1
@Satir: menambahkan penjelasan singkat. Jawaban lain memiliki tautan ke artikel Wikipedia.
Nosrama
32

Saat ini Anda harus menggunakan WebSockets. Ini adalah standar 2011 yang memungkinkan untuk memulai koneksi dengan HTTP dan kemudian meningkatkannya ke komunikasi berbasis pesan klien-server dua arah.

Anda dapat dengan mudah memulai koneksi dari 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
};

Penanganan sisi server tergantung pada tenchnology stack Anda.

pafinde
sumber
2
Vs peristiwa yang dikirim server: stackoverflow.com/questions/5195452/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
8
Saya sangat setuju ... Menggunakan HTTP untuk komunikasi dua arah seperti berpikir dalam panggilan REST untuk membuat Mario melompat ke cangkang kura-kura ... itu kegilaan. Anda tidak PERLU membuat permintaan dan menunggu tanggapan untuk menekan tombol sederhana orang .... Anda tidak perlu. HTTP adalah protokol dokumen. Hyper TEXT Transfer Protocol. Ajax Push adalah cara yang sangat rumit untuk menghindari HTTP untuk melakukan apa yang WebSocket lakukan dengan desain. Berhenti bersikap konyol dan gunakan alat yang tepat untuk pekerjaan itu.
Nick Steele
Anda sangat menyukai elips, dan terkadang bentuk baru dari empat titik yang akan saya sebut "elipsos"!
imbatman
10

Lihatlah ke Comet (spoof dari fakta bahwa Ajax adalah agen pembersih dan begitu juga Comet) yang pada dasarnya adalah "Ajax terbalik." Ketahuilah bahwa ini membutuhkan koneksi server yang tahan lama bagi setiap pengguna untuk menerima pemberitahuan, jadi waspadalah dengan implikasi kinerja saat menulis aplikasi Anda.

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

Dan Herbert
sumber
5

Saya sangat menyarankan untuk menginvestasikan waktu di Comet, tetapi saya tidak tahu implementasi atau pustaka aktual yang dapat Anda gunakan.

Untuk semacam "panel kontrol pusat panggilan" dari aplikasi web yang melibatkan agen pembaruan dan status antrian panggilan untuk Pusat Panggilan langsung, kami mengembangkan solusi internal yang berfungsi, tetapi jauh dari perpustakaan yang dapat Anda gunakan.

Apa yang kami lakukan adalah menerapkan layanan kecil di server yang terhubung ke sistem telepon, menunggu acara baru dan menyimpan foto situasi tersebut. Layanan ini menyediakan server web kecil.

Klien web kami terhubung melalui HTTP ke server web ini dan meminta foto terakhir (dikodekan dalam XML), menampilkannya dan kemudian pergi lagi, meminta foto baru. Server web saat ini dapat:

  • Kembalikan foto baru, jika ada
  • Blokir klien selama beberapa detik (30 dalam pengaturan kami) menunggu beberapa peristiwa terjadi dan ubah foto. Jika tidak ada peristiwa yang dibuat pada saat itu, ia mengembalikan foto yang sama, hanya untuk memungkinkan koneksi tetap hidup dan bukan waktu tunggu klien.

Dengan cara ini, ketika klien melakukan polling, ia mendapat respons dalam maks 0 hingga 30 detik. Jika acara baru sudah dibuat, acara itu akan segera mendapatkannya), jika tidak, acara akan diblokir hingga acara baru dibuat.

Ini pada dasarnya adalah polling, tetapi polling agak cerdas untuk tidak membuat server web terlalu panas. Jika Comet bukan jawaban Anda, saya yakin ini dapat diimplementasikan menggunakan ide yang sama tetapi menggunakan AJAX atau pengkodean yang lebih ekstensif di JSON untuk hasil yang lebih baik. Ini dirancang sebelum era AJAX, jadi ada banyak ruang untuk perbaikan.

Jika seseorang dapat memberikan implementasi ringan yang sebenarnya dari ini, bagus!

Pablo Alsina
sumber
5

Alternatif menarik untuk Comet adalah menggunakan soket di Flash.

Gilles
sumber
2

Ada metode lain. Tidak yakin apakah mereka "lebih baik" dalam situasi Anda. Anda bisa memiliki applet Java yang terhubung ke server saat halaman dimuat dan menunggu barang dikirim oleh server. Ini akan menjadi sedikit lebih lambat saat start-up, tetapi akan memungkinkan browser menerima data dari server secara jarang, tanpa polling.

Kibbee
sumber
2

Anda dapat menggunakan aplikasi Flash / Flex di klien dengan BlazeDS atau LiveCycle di sisi server. Data dapat dikirim ke klien menggunakan koneksi RTMP. Ketahuilah bahwa RTMP menggunakan port non standar. Namun Anda dapat dengan mudah kembali ke polling jika porta diblokir.

Buzzy
sumber
2

Anda dapat mencapai apa yang Anda tuju melalui penggunaan koneksi http yang persisten.

Lihat artikel Comet di wikipedia, itu tempat yang baik untuk memulai.

Anda tidak memberikan banyak info tetapi jika Anda ingin membangun semacam situs yang digerakkan oleh peristiwa (mata-mata a'la digg) atau sesuatu yang sejalan dengan itu, Anda mungkin akan melihat penerapan IFRAME tersembunyi yang terhubung ke url di mana koneksi tidak pernah ditutup dan kemudian Anda akan mendorong tag skrip dari server ke klien untuk melakukan pembaruan.

Markus Olsson
sumber
1

Setelah koneksi dibuka ke server, itu dapat tetap terbuka dan server dapat Mendorong konten beberapa waktu yang lalu saya lakukan dengan menggunakan multipart/x-mixed-replacetetapi ini tidak berfungsi di IE.

Saya pikir Anda dapat melakukan hal-hal pintar dengan polling yang membuatnya bekerja lebih seperti push dengan tidak mengirim header konten yang tidak diubah tetapi membiarkan koneksi terbuka tetapi saya tidak pernah melakukan ini.

percikan
sumber
1

Anda dapat mencoba Komponen Komet kami - meskipun ini sangat eksperimental ...!

Thomas Hansen
sumber
1

silakan periksa pustaka ini https://github.com/SignalR/SignalR untuk mengetahui cara mendorong data ke klien secara dinamis saat tersedia

arun peddakotla
sumber
0

Anda juga dapat melihat ke Java Pushlets jika Anda menggunakan halaman jsp.

Ryan Ahearn
sumber
0

Mungkin ingin melihat ReverseHTTP juga.

Evan
sumber