1. Pengantar singkat untuk Websocket
Websocket Protocol adalah protokol baru untuk HTML5. Ini mengimplementasikan komunikasi dupleks penuh antara browser dan server. Jabat tangan awal membutuhkan bantuan permintaan HTTP untuk menyelesaikan jabat tangan.
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.
Latar Belakang Websocket
Hanya komunikasi satu arah yang dapat dicapai melalui HTTP di browser. Comet dapat mensimulasikan komunikasi dua arah sampai batas tertentu, tetapi efisiensi rendah dan membutuhkan dukungan yang baik dari server; Socket dan XMLSocket di Flash dapat mewujudkan komunikasi dua arah yang sebenarnya, dan kedua fungsi ini dapat digunakan dalam JavaScript melalui Flex Ajax Bridge. Dapat diperkirakan bahwa jika WebSocket diimplementasikan di browser, itu akan menggantikan dua teknologi di atas dan banyak digunakan. Menghadapi situasi ini, HTML5 mendefinisikan protokol WebSocket, yang dapat menyimpan sumber daya dan bandwidth server dengan lebih baik dan mencapai komunikasi waktu nyata.
Protokol Websocket juga diimplementasikan di Javaee7.
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.
2. Contoh Websocket
2.1. Buat Proyek Uji Javaweb baru
Tambahkan ketergantungan paket jar di pom.xml
<dependency> <GroupId> javax </groupId> <ArTifactId> javaee-api </artifactid> <version>. </version> <scope> disediakan </opope> </dependency>
Kode Klien (Beranda Web):
< %@ page language = "java" pageEncoding = "utf-" %> <! Doctype html> <html> <head> <title> implementasi tomcat dari java backend WebSocket </iteme> </adept> <body> selamat datang <br/> <input id = "teks" type = "text"/</head> <br/"Kirim" KIMPUT = "TEXT" TYPE = "TEXT"//</BOGKLICK = "KIMPUT" KIMPUT = "TEXT" TYPE = "TEXT"//</KOMPON KOMPON = "KIMPUT" KIMPUT = "Teks" onclick="closeWebSocket()">Close WebSocket connection</button><hr/><div id="message"></div></body><script type="text/javascript">var websocket = null;//Determine whether the current browser supports WebSocketif ('WebSocket' in window) {websocket = new WebSocket ("WS: // LocalHost:/WebSocket");} else {alert ('Browser saat ini tidak mendukung WebSocket')} // metode panggilan balik untuk kesalahan dalam koneksi WebSocket.onError = function () {setMessageInnerHtml ("Websocket Koneksi Kesalahan WebSocket di WebSocket");};};/}; {setMessageInnerHtml ("WebSocket Connection Sukses");} // Metode Callback Untuk Menerima Pesan Websocket.onMessage = Function (event) {setMessageInnerHtml (event.data);} // koneksi callback metode WebSocket.onclose = function () {setMessageInner peristiwa. 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/>';} // closeD + = innerHtml + '<br/>';}///closeing Websock + = innerHtml + '<br/>';}/}//closeD + = innerHtml + '<br/>';}/}/} websock + = innerHtml + '<br/>';}/} // {WebSocket.Close ();} // Kirim fungsi pesan kirim () {var message = document.getElementById ('text'). value; websocket.send (pesan);} </script> </html> Kode backend web java
Paket Me.Gacl.Websocket; impor java.io.ioException; impor java.util.concurrent.copyonwriteArrayset; Fungsinya terutama untuk mendefinisikan kelas saat ini sebagai sisi server WebSocket. Nilai anotasi akan digunakan untuk mendengarkan koneksi pengguna ke alamat URL akses terminal pengguna. Klien dapat terhubung ke sisi server WebSocket melalui URL*/@ServerEndPoint ("/WebSocket") ini WebsocketTest {// variabel statis yang digunakan untuk merekam jumlah koneksi online saat ini. Itu harus dirancang agar aman. Private Static Int Onlinecount =; // Set-Safe Safe dari paket bersamaan 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 <WebSocketTest> (); // Sesi koneksi dengan klien tertentu perlu dikirim ke klien melalui sesi pribadi; Sesi adalah sesi koneksi dengan klien tertentu, dan perlu mengirim data ke klien melalui itu*/@onopenpublic void onopen (sesi sesi) {this.Session = sesi; websocketset.add (ini); // tambahkan ke addonlinecount () di set; // Tambahkan ke System.out.println ("Ada koneksi baru untuk bergabung! Jumlah orang yang online saat ini adalah" + getOnlinecount ());}/*** Metode untuk menghubungkan panggilan penutupan*/@Onclosepublic void onclose () {WebSocketset.remove (this); // hapus subonlinecount () dari set; // Penurunan sistem nomor online.out.println ("Ada koneksi yang ditutup! Jumlah orang yang online saat ini adalah" + getOnlinecount ());}/*** Metode yang dipanggil setelah menerima pesan klien* @param pesan yang dikirim oleh klien* @param sesi opsional parameter*/ @onMessagePublic void onMessage ("@param Sesi," Sesi, "SESI SESI," SESI SESI, "SESI," SESI SESI, "SESI," SESI SESI, "ONMESSAGEPUPLIC VOID (SESI SESI, pesan); // pesan batch untuk (item WebSocketTest: WebSocketset) {coba {item.sendMessage (pesan);} catch (ioException e) {e.printstacktrace (); lanjut;}}}/*** dipanggil ketika kesalahan terjadi* @param sesi* @param error*/ @onerrorpublorpen kesalahan) {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. * Pesan @param* @throws IoException*/public void sendMessage (string message) melempar ioException {this.session.getBasicremote (). sendtext (pesan); // this.Session.getAsyncremote (). Sendtext (pesan);} public static interconized static getoncount (). sendtext (pesan);} public static static getOncount static static static getoncount () {msage);} public static static getOncoLICET (). addonlinecount () {WebSockettest.onlinecount ++;} public static static void subonlinecount () {WebSockettest.onlinecount--;}} 1.2. Efek Operasi
Buka Browser Google dan Browser Firefox secara bersamaan untuk tes simulasi multi-klien. Efek operasi adalah sebagai berikut:
Konten di atas adalah contoh tutorial untuk mengimplementasikan WebSocket oleh Java Backend Tomcat yang diperkenalkan kepada Anda. Saya harap ini akan membantu semua orang!