Skenario: Data pembaruan backend didorong ke klien (bagian java menggunakan server Tomcat).
Ada banyak solusi untuk mendorong data di backend, seperti pemungutan suara, komet, dan websocket.
1. Polling adalah biaya pengembangan terendah untuk backend, yang berarti memproses permintaan AJAX dan mengembalikan data dengan cara tradisional. Ketika saya masih di sekolah, proyek -proyek laboratorium selalu menggunakan pemungutan suara karena itu adalah yang paling aman dan termudah untuk diimplementasikan. Namun, pemborosan sumber daya komunikasi yang disebabkan oleh pemungutan suara tidak dapat diabaikan. Terlepas dari apakah data berubah atau tidak, permintaan akan dikirim dan ditanggapi seperti biasa, dan setiap permintaan HTTP akan memiliki informasi header yang panjang.
2. Konsep Comet adalah koneksi yang panjang. Setelah klien mengirimkan permintaan, backend menjaga koneksi sampai koneksi habis atau backend mengembalikan data, dan kemudian membangun kembali koneksi, secara efektif mentransfer sumber daya komunikasi ke server, yang sebenarnya mengkonsumsi sumber daya server.
3. Websocket adalah teknologi komunikasi dupleks penuh yang disediakan oleh HTML5. Ini mewujudkan komunikasi antara klien dan server melalui "jabat tangan". Ini memiliki kinerja real-time yang baik dan kepala kecil. Browser yang saat ini didukung adalah sebagai berikut:
Situasi yang ideal adalah menggunakan kombinasi Websocket dan Comet, dan menggunakan metode Comet untuk menurunkan peringkat browser seperti IE8. Namun dengan cara ini, backend perlu mengimplementasikan dua logika untuk memproses permintaan, yaitu Websocket dan Comet. Oleh karena itu, artikel ini telah menambahkan node.js. Alasan untuk melakukan ini adalah untuk mentransfer logika yang menangani WebSocket (atau COMET) ke bagian Node.js, dan tidak "menyebabkan masalah" ke backend, karena dalam situasi aktual, tidak mudah bagi pengembang front-end untuk mempromosikan pengembang back-end. Node.js adalah lapisan menengah untuk komunikasi antara browser dan lapisan logika bisnis Java, menghubungkan klien ke Tomcat, dan berkomunikasi dengan Tomcat melalui soket (itu adalah soket, bukan Websocket, dan backend perlu menerapkan antarmuka soket.
Pada klien, Websocket dan Comet diimplementasikan melalui Socket.io. Socket.io akan memilih metode implementasi yang sesuai (WebSocket, Long Pull ..) untuk versi browser yang berbeda atau klien yang berbeda. Pengenalan Socket.io memudahkan untuk menangani WebSocket (atau koneksi panjang). Socket.io
Klien memperkenalkan socket.io:
<skrip src = "static/js/socket.io.js"> </script>
Kode JavaScript Klien:
var socket = io.connect ('127.0.0.1:8181'); // Kirim data ke server socket.emit ('fromWebClient', jsondata); // menerima data dari server socket.on ('pushtowebclient', function (data) {// do sth.});Node.js Code Server:
var http = membutuhkan ('http'), app = http.createServer (). dengarkan ('8181'), io = membutuhkan ('socket.io'). Listen (app); io.sockets.on ('connection', function (socketio) {// menerima data dari klien socketio.on ('fromWebClient', function (webclientData) {// do sth.}); // client Disconnect socketio.on ('Disponnect', function () {console.log ('disconnect Socketio.emit ('PushTowebClient', Jsondata);Menetapkan koneksi yang baik antara klien dan server Node.js hanyalah langkah pertama. Berikut ini juga mengharuskan membangun koneksi antara server Node.js dan lapisan logika bisnis Java. Pada saat ini, server Node.js berfungsi sebagai klien untuk mengirim permintaan koneksi TCP ke Tomcat. Setelah koneksi berhasil, Node.js Server dan Tomcat membuat saluran dupleks penuh, dan itu adalah satu -satunya. Tidak peduli berapa banyak permintaan klien, mereka diteruskan dari server Node.js ke Tomcat; Demikian pula, data yang didorong oleh Tomcat juga didistribusikan ke setiap klien melalui server Node.js.
Ada masalah di sini, yaitu, setelah koneksi Websocket dan koneksi soket dibuat, kedua koneksi diblokir. Tomcat tidak tahu koneksi Websocket mana yang mengirim data, juga tidak tahu klien mana yang mengirim data. Tentu saja, Node.js dapat menggunakan ID sesi untuk dikirim ke Tomcat untuk mengidentifikasi klien mana itu, tetapi artikel ini menggunakan metode lain.
Ketika klien membuat koneksi WebSocket dengan Node.js, setiap koneksi akan berisi instance, yang disebut Socketio di sini. Setiap socketio memiliki atribut ID untuk secara unik mengidentifikasi koneksi ini, yang disebut socket_id di sini. Menggunakan Socket_ID, tabel pemetaan dibuat pada server Node.js untuk menyimpan hubungan pemetaan antara setiap Socketio dan Socket_ID. Ketika server Node.js mengirimkan data ke Tomcat, Socket_id dibawa dengan itu, dan kemudian bagian Java melakukan serangkaian pemrosesan, kemudian merangkum berbagai data yang diperlukan oleh setiap klien dan mengembalikannya. Data yang dikembalikan harus memiliki hubungan yang sesuai dengan Socket_ID. Dengan cara ini, ketika server Node.js menerima data yang dikirim oleh Tomcat, didistribusikan ke klien yang berbeda dengan socketio yang berbeda melalui tabel pemetaan yang disebutkan di atas.
Node.js Code Server:
var http = membutuhkan ('http'), net = membutuhkan ('net'), app = http.createServer (). Listen ('8181'), io = membutuhkan ('socket.io'). Listen (app), nodeServer = net net.socket (); // Sambungkan ke Tomcat nodeserver.connect (8007, '127.0.0.1', function () {console.log ('connected');}); // Simpan instance koneksi WebSocket klien var asocket = {}; // Buat koneksi dengan klien io.sockets.on ('connection', function (socketio) {// menerima data dari klien dan mengirimkannya ke tomcat socketio.on ('fromwebclient', function (WebClientData) {// simpan ke tabel pemetaan asocket [socketio.id] = socketio;// {// simpan ke tabel pemetaan asocket [socketio.id] = socketio; Socketio.id; }); // Menerima data dari Tomcat nodeserver.on ('data', function (data) {var jsondata = json.parse (data.toString ()); // Distribusikan data ke klien untuk (var i di jsondata.list) {asocket [jsondata.list [i] ['sid']. jsondata.list [i] .data);Kode di atas menghilangkan beberapa logika, seperti data yang diterima oleh server Node.js dari Tomcat dibagi menjadi dua jenis, satu adalah data yang didorong, dan yang lainnya adalah data yang menanggapi permintaan. Di sini, data yang didorong diproses secara seragam.
Saat memproses komunikasi, data yang dikirim oleh Node.js ke Tomcat dalam format string, dan data yang diterima dari Tomcat adalah objek buffer (delapan-byte), yang perlu dikonversi menjadi string dan kemudian dikonversi menjadi JSON dan dikirim ke klien.
Artikel ini hanya memberikan contoh sederhana dari dua koneksi seperti itu, dan banyak hal yang perlu ditambahkan ke bisnis tertentu. Karena Node.js diperkenalkan ke dalam proyek, front-end perlu melakukan lebih banyak hal, seperti pemrosesan, caching, dan bahkan menambahkan banyak logika bisnis.