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.
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. Jenis model web tradisional ini adalah proaktif dan server adalah 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.
** Seiring dengan peluncuran HTML5, WebSocket benar-benar menyadari komunikasi real-time 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, dan menggunakan WebSocket untuk mengimplementasikan ruang obrolan.
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 berikut juga harus dijalankan di Tomcat7.0.27 atau lebih tinggi.
Kode Server Websocket
// Anotasi ini digunakan untuk menentukan URI, di mana klien dapat terhubung ke Websocket. Pemetaan anotasi seperti servlet. Tidak perlu mengonfigurasinya di web.xml. @ServerEndPoint ("/WebSocket") Kelas Publik WebsocketDemo {// Variabel statis yang digunakan untuk merekam jumlah koneksi online saat ini. Itu harus dirancang agar aman. Atomicinteger final statis pribadi onlinecount = atomicinteger baru (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 <En websocketDemo> websocketset = new copyOnWriteArrayset <WebSocketDemo> (); // Tentukan nama panggilan obrolan yang merekam nama panggilan string final klien; // Sambungkan sesi koneksi dengan klien tertentu, dan Anda perlu mengirim data ke sesi sesi pribadi klien; WebSocketDemo publik () {nickName = "Guest" + onlinecount.getAndIncrement (); } / * * Gunakan anotasi @onopen untuk menunjukkan pengembalian setelah tautan klien berhasil. Sesi parameter adalah parameter opsional sesi ini adalah sesi dalam spesifikasi WebSocket, mewakili sesi. Bukan httpsession */ @onopen public void onopen (sesi sesi) {this.Session = sesi; websocketset.add (ini); String message = string.format ("[%s,%s]", julukan, "tambahkan ke ruang obrolan"); siaran (pesan); System.out.println ("OnOpen"); }/ * * Gunakan anotasi @OnMessage untuk menunjukkan kapan klien mengirim pesan dan parameter pertama menunjukkan data yang dikirim oleh pengguna. Sesi parameter adalah parameter opsional, yang konsisten dengan sesi dalam metode OnOpen */@onmessage public void onMessage (pesan string, sesi sesi) {// Tentu saja sistem true.out.println (this.Session == sesi); siaran (string.format ("%s:%s", julukan, filter (pesan))); }/ ** Callback Setelah pengguna memecahkan tautan, perhatikan bahwa metode ini harus dipanggil setelah klien memanggil metode tautan yang rusak*/ @onclose public void onclose () {WebSocketset.remove (ini); String message = string.format ("[%s,%s]", julukan, "tinggalkan tautan ruang obrolan"); siaran (pesan); } // Lengkapi massal kirim private void siaran (info string) {for (WebSocketDemo w: WebSocketset) {coba {disinkronkan (WebSocketDemo.class) {w.session.getBasicRemote (). SendText (info); }} catch (ioException e) {System.out.println ("Kirim pesan ke klien"+w.nickname+"Gagal mengirim pesan"); websocketset.remove (w); coba {w.session.close (); } catch (ioException e1) {} string message = string.format ("[%s,%s]", w.nickname, "terputus"); siaran (pesan); }}} // Dapat membuat beberapa permintaan pemfilteran untuk pesan pengguna, seperti kata kunci pemblokiran, dll. . public static string filter (string message) {if (message == null) {return null; } kembalikan pesan; }}Kode Klien (Beranda Web):
<! Doctype html> <html> <head> <meta charset = "utf-8"> <title> masukkan judul di sini </itement> <script type = "text/javascript"> var ws = websocket baru ("ws: // localhost: 8080/WebSocketTest/WebSocket"); / * * Dengarkan perubahan di tiga negara bagian. js akan callback*/ ws.onopen = function (pesan) {}; ws.onclose = function (pesan) {}; ws.onmessage = function (pesan) {showmessage (message.data); }; // 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 () {ws.close (); }; // tutup fungsi koneksi closeWebsocket () {ws.close (); } // Kirim fungsi pesan mengirim () {var input = document.geteLementById ("msg"); var text = input.value; ws.send (teks); input.value = ""; } function showMessage (pesan) {var text = document.createTextNode (pesan); var br = document.createElement ("br") var div = document.geteLementById ("showchatmessage"); Div.AppendChild (teks); Div.AppendChild (BR); } </script> </head> <body> <Div id = "show"> <div id = "showChatMessage"> </div> <input type = "text" size = "80" id = "msg" name = "msg" placeholder = "masukkan konten obrolan"/> <input type = "tombol" value = "send" ID = "sendbn" name "name" sendbn "sendbn" OnClick = "send ()"> </body> </html>Seperti disebutkan di atas, ruang obrolan dengan fungsi obrolan grup selesai. Selama proses verifikasi, ditemukan bahwa menggunakan WebSocket dapat menyelesaikan permintaan lintas domain.
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.