1. Pengantar singkat untuk Websocket
Dengan pengembangan Internet, protokol HTTP tradisional sulit untuk memenuhi kebutuhan aplikasi web yang semakin kompleks. Dalam beberapa tahun terakhir, dengan kelahiran HTML5, protokol Websocket telah diusulkan. Ini mewujudkan komunikasi dupleks penuh antara browser dan server, memperluas fungsi komunikasi antara browser dan server, dan memungkinkan server untuk secara aktif mengirim data ke klien.
Kita tahu bahwa protokol HTTP tradisional tidak memiliki kewarganegaraan. Setiap permintaan harus diprakarsai oleh klien (seperti browser). Setelah diproses, server mengembalikan hasil respons. Sulit bagi server untuk secara aktif mengirim data ke klien. Klien jenis ini adalah pihak yang aktif dan server adalah pihak pasif. Model web tradisional menyebabkan lebih sedikit masalah untuk aplikasi web dengan perubahan informasi yang jarang, tetapi hal itu membuat ketidaknyamanan besar pada aplikasi web yang melibatkan informasi waktu nyata, seperti aplikasi dengan fungsi seperti komunikasi instan, data real-time, dorongan berlangganan, dll. Sebelum spesifikasi WebSocket diusulkan, pengembang sering menggunakan solusi trade-off untuk mengimplementasikan fungsi yang sangat real-time ini: pemilihan dan comet. Faktanya, yang terakhir pada dasarnya adalah semacam pemungutan suara, tetapi telah ditingkatkan.
Polling adalah solusi paling orisinal untuk mengimplementasikan aplikasi web real-time. Teknologi pemungutan suara mengharuskan klien untuk secara berkala mengirim permintaan ke server pada interval waktu yang ditentukan dan sering bertanya apakah ada perubahan data baru. Jelas, pendekatan ini dapat menyebabkan terlalu banyak permintaan yang tidak perlu, membuang -buang sumber daya lalu lintas dan server.
Teknologi komet dapat dibagi menjadi teknologi pemungutan suara dan streaming yang panjang. Jajak pendapat yang panjang meningkatkan teknologi pemungutan suara yang disebutkan di atas, mengurangi permintaan yang tidak berguna. Ini menetapkan waktu kedaluwarsa untuk data tertentu, dan hanya mengirim permintaan ke server setelah data berakhir; Mekanisme ini cocok untuk situasi di mana perubahan data tidak terlalu sering terjadi. Teknologi streaming biasanya mengacu pada klien menggunakan jendela tersembunyi untuk membuat koneksi panjang HTTP dengan server. Server akan terus memperbarui status koneksi untuk menjaga koneksi panjang HTTP tetap hidup; Dengan cara ini, server dapat secara aktif mengirim data ke klien melalui koneksi panjang ini; Teknologi streaming dapat menguji kinerja server di lingkungan konkurensi yang besar.
Kedua teknologi didasarkan pada mode permintaan-respons dan tidak dianggap teknologi real-time dalam arti sebenarnya; Setiap permintaan atau respons limbah mereka sejumlah lalu lintas pada informasi header yang sama, dan kompleksitas pengembangan juga tinggi.
Dengan peluncuran HTML5, WebSocket benar-benar menyadari komunikasi real-time dari Web, membuat mode B/S memiliki kemampuan komunikasi real-time mode C/S. Alur kerja Websocket adalah sebagai berikut: Browser mengirimkan permintaan ke server untuk membuat koneksi WebSocket melalui JavaScript. Setelah koneksi Websocket berhasil ditetapkan, klien dan server dapat mengirimkan data melalui koneksi TCP. Karena koneksi WebSocket pada dasarnya adalah koneksi TCP, tidak memerlukan data header berulang untuk dibawa dengan setiap transmisi, sehingga volume transmisi data jauh lebih kecil daripada teknologi pemungutan suara dan komet. Artikel ini tidak memperkenalkan spesifikasi WebSocket secara rinci, tetapi terutama memperkenalkan implementasi WebSocket di Java Web.
Javaee 7 telah menciptakan JSR-356: Java API untuk spesifikasi WebSocket. Banyak wadah web, seperti Tomcat, Nginx, Jetty, dll., Mendukung WebSocket. Tomcat mendukung WebSocket sejak 7.0.27 dan JSR-356 sejak 7.0.47. Kode demo berikut juga perlu digunakan di Tomcat7.0.47 atau lebih tinggi untuk dijalankan.
Kode Klien (Beranda Web):
< %@ page language = "java" pageEncoding = "UTF-8" %> <! Doctype html> <html> <head> <title> Tomcat implementasi java backend WebSocket </iteme> </head> <body> Welcome <br/> <input ID = "teks" type = "teks" OnClick = "closeWebsocket ()"> Tutup koneksi WebSocket </button> <hr/> <div id = "message"> </div> </body> <script type = "text/javascript"> var WebSocket = null; // menilai apakah browser saat ini mendukung WebSocket if ('WebSocket' di jendela) {WebSocket = WebSocket baru ("WS: //172.16.98.31: 8080/WebSocket/WebSocket"); } else {alert ('Browser saat ini tidak mendukung WebSocket'); } // metode panggilan balik untuk kesalahan dalam koneksi WebSocket.onError = function () {setMessageInnerHtml ("Kesalahan dalam koneksi WebSocket"); }; // Metode Callback Untuk Koneksi Sukses Websocket.onopen = function () {setMessageInnerHtml ("WebSocket Connection Sukses"); } // metode panggilan balik untuk menerima pesan WebSocket.onMessage = function (event) {setMessageInnerHtml (event.data); } // Metode panggilan balik dari koneksi menutup WebSocket.onclose = function () {setMessageInnerHtml ("WebSocket Connection Closed"); } // Dengarkan acara penutupan jendela. Ketika jendela ditutup, secara aktif tutup koneksi WebSocket untuk mencegah jendela dari tutup sebelum koneksi terputus, dan sisi server akan melempar pengecualian. window.onbeforeunload = function () {closeWebsocket (); } // Tampilkan pesan pada fungsi halaman web setMessageInnerHtml (innerHtml) {document.getElementById ('pesan'). InnerHtml + = innerHtml + '<br/>'; } // tutup fungsi koneksi WebSocket closeWebsocket () {WebSocket.close (); } // Kirim Fungsi Pesan Kirim () {var message = document.geteLementById ('text'). Value; websocket.send (pesan); } </script> </html> Kode backend web java
Paket cn.com; impor java.io.ioException; import java.util.concurrent.copyonwriteArrayset; import javax.websocket.*; import javax.websocket.server.serverendpoint;/*** @serverendpoint annotasi adalah nonrumasi level kelas. Fungsinya terutama untuk mendefinisikan kelas saat ini sebagai sisi server WebSocket. * Nilai anotasi akan digunakan untuk mendengarkan koneksi pengguna ke alamat URL akses terminal. Klien dapat terhubung ke sisi server WebSocket melalui URL ini* setiap kali permintaan dibuat, sebuah instance akan dibuat*/@serverendpoint ("/WebSocket") Kelas Publik Websockettest {// Variabel statis digunakan untuk merekam jumlah koneksi online saat ini. Itu harus dirancang agar aman. private static int onlinecount = 0; // Kumpulan paket bersamaan yang aman digunakan digunakan untuk menyimpan objek myWebsocket yang sesuai dari setiap klien. Untuk menyadari bahwa server berkomunikasi dengan satu klien, Anda dapat menggunakan peta untuk menyimpannya, di mana kunci dapat mengidentifikasi pengguna private static copyonWriteArrayset <WebSocketTest> WebSocketset = new copyOnWriteArrayset <En websocketTest> (); // Sesi koneksi dengan klien tertentu perlu mengirim data ke klien melalui sesi sesi pribadi; /*** Metode untuk berhasil memanggil pembentukan koneksi* parameter opsional sesi @param. Sesi adalah sesi koneksi dengan klien, dan perlu mengirim data ke klien melalui itu*/ @onopen public void onopen (sesi sesi) {this.Session = sesi; websocketset.add (ini); // Tambahkan ke addonlinecount () di set; // Tambahkan 1 nomor online System.out.println ("Ada koneksi baru untuk bergabung! Jumlah orang online saat ini adalah" + getOnlinecount ()); } / *** Metode untuk menghubungkan panggilan penutupan* / @onclose public void onClose () {WebSocketset.remove (ini); // hapus subonlinecount () dari set; // Hapus nomor online dengan 1 nomor online System.out.println ("Ada koneksi yang ditutup! Jumlah orang online saat ini adalah" + getOnlinecount ()); } / *** Metode dipanggil setelah menerima pesan klien* @param pesan pesan yang dikirim oleh klien* @param sesi parameter opsional* / @onmessage public void onMessage (pesan string, sesi sesi) {System.out.println ("Pesan dari klien:" + pesan); // pesan batch untuk (item WebSocketTest: websocketset) {coba {item.sendMessage (pesan); } catch (ioException e) {e.printstacktrace (); melanjutkan; }}}} / ** * dipanggil saat kesalahan terjadi * @param sesi * @param error * / @onerror public void onError (sesi sesi, kesalahan throwable) {system.out.println ("kesalahan terjadi"); error.printstacktrace (); } /*** Metode ini berbeda dari metode di atas. Tidak ada anotasi, itu adalah metode yang ditambahkan sesuai dengan kebutuhan Anda. * @param pesan * @throws ioException */ public void sendMessage (string message) melempar ioException {this.session.getBasicRemote (). sendText (pesan); //this.session.getAsyncremote().sendText(message); } public static sinkronisasi int getOnlinecount () {return onlinecount; } public static static void addonlinecount () {WebSockettest.onlinecount ++; } public static yang disinkronkan void subonlinecount () {WebSockettest.onlinecount--; }}Buka dua browser, masukkan URL, dan jalankan secara langsung
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.