السيناريو: يتم دفع بيانات تحديث الواجهة الخلفية إلى العميل (يستخدم جزء Java خادم Tomcat).
هناك العديد من الحلول لدفع البيانات في الواجهة الخلفية ، مثل الاقتراع والمذنب و WebSocket.
1. الاقتراع هو أقل تكلفة تطوير للواجهة الخلفية ، مما يعني معالجة طلبات AJAX وإعادة البيانات بالطريقة التقليدية. عندما كنت في المدرسة ، تستخدم المشاريع المختبرية دائمًا الاقتراع لأنها الأكثر أمانًا وأسهل تنفيذها. ومع ذلك ، لا يمكن تجاهل إهدار موارد الاتصال الناتجة عن الاقتراع. بغض النظر عما إذا كانت البيانات تتغير أم لا ، سيتم إرسال الطلب والرد عليه كالمعتاد ، وسيكون لكل طلب HTTP معلومات رأس طويلة.
2. مفهوم المذنب هو علاقة طويلة. بعد أن يرسل العميل طلبًا ، تحتفظ الواجهة الخلفية بالاتصال حتى يتم توقيت الاتصال أو إرجاع الواجهة الخلفية ، ثم يعيد تأسيس الاتصال ، ونقل موارد الاتصالات بشكل فعال إلى الخادم ، الذي يستهلك بالفعل موارد الخادم.
3. WebSocket هي تقنية اتصال كاملة الانعطاف التي توفرها HTML5. يدرك التواصل بين العميل والخادم من خلال "المصافحة". لديها أداء جيد في الوقت الفعلي ورأس صغير. المتصفحات المدعومة حاليًا هي كما يلي:
الموقف المثالي هو استخدام مجموعة WebSocket و Comet ، واستخدام طريقة المذنب لخفض المتصفحات مثل IE8. ولكن بهذه الطريقة ، تحتاج الواجهة الخلفية إلى تنفيذ منطقين لمعالجة طلبات ، وهما WebSocket و Comet. لذلك ، أضافت هذه المقالة node.js. السبب في ذلك هو نقل المنطق الذي يتولى WebSocket (أو المذنب) إلى جزء Node.js ، وليس "تحفيز المتاعب" إلى الواجهة الخلفية ، لأنه في المواقف الفعلية ، ليس من السهل على المطورين الأماميين الترويج للمطورين الخلفيين. Node.js هي الطبقة الوسيطة للاتصال بين المتصفح وطبقة منطق Business Java ، وتوصيل العميل إلى tomcat ، والتواصل مع tomcat من خلال المقبس (هو المقبس ، وليس WebSocket ، ويحتاج الخلفية إلى تنفيذ واجهة المقبس.
على العميل ، يتم تنفيذ WebSocket و Comet من خلال Socket.io. سيختار Socket.io طريقة التنفيذ المناسبة (WebSocket ، سحب طويل ..) لإصدارات المتصفح المختلفة أو عملاء مختلفين. يجعل إدخال Socket.io من السهل التعامل مع WebSocket (أو اتصال طويل). Socket.io
يقدم العميل socket.io:
<script src = "static/js/socket.io.js"> </script>
رمز العميل JavaScript:
var socket = io.connect ('127.0.0.1:8181') ؛ // إرسال البيانات إلى Server Socket.emit ('FromWebClient' ، jsondata) ؛ // استلام البيانات من Server Socket.on ('pushtowebclient' ، function (data) {// do sth.}) ؛رمز خادم Node.js:
var http = require ('http') ، app = http.createserver (). الاستماع ('8181') ، io = require ('socket.io'). الاستماع (التطبيق) ؛ io.sockets.on ('connection' ، function (socketio) {// استلام البيانات من socketio.on ('fromWebClient' ، function (webclientdata) {// do sth.}) ؛ socketio.emit ('pushtowebclient' ، jsondata) ؛إن إنشاء اتصال جيد بين العميل وخادم Node.js هو الخطوة الأولى فقط. ما يلي يتطلب أيضًا إنشاء اتصال بين خادم Node.js وطبقة منطق Business Java. في هذا الوقت ، يعمل خادم Node.js كعميل لإرسال طلب اتصال TCP إلى Tomcat. بعد نجاح الاتصال ، يقوم خادم Node.js و Tomcat بإنشاء قناة مزدوجة كاملة ، وهي القناة الوحيدة. بغض النظر عن عدد طلبات العميل ، يتم إعادة توجيهها من خادم Node.js إلى Tomcat ؛ وبالمثل ، يتم توزيع البيانات التي يتم دفعها بواسطة Tomcat على كل عميل عبر خادم Node.js.
هناك مشكلة هنا ، أي بعد إنشاء اتصالات WebSocket واتصالات المقبس ، يتم حظر الاتصالان. لا يعرف Tomcat أي اتصال WebSocket الذي أرسل البيانات ، ولا يعرف العميل الذي أرسل البيانات. بالطبع ، يمكن لـ Node.js استخدام معرف الجلسة للإرسال إلى Tomcat لتحديد العميل ، ولكن هذه المقالة تستخدم طريقة أخرى.
عندما يقوم العميل بإنشاء اتصال WebSocket باستخدام Node.js ، سيحتوي كل اتصال على مثيل ، يسمى Socketio هنا. يحتوي كل مقبس على سمة معرف لتحديد هذا الاتصال بشكل فريد ، والذي يسمى socket_id هنا. باستخدام Socket_id ، يتم إنشاء جدول رسم الخرائط على خادم Node.js لتخزين علاقة التعيين بين كل مقبس و Socket_id. عندما يرسل خادم Node.js البيانات إلى Tomcat ، يتم إحضار Socket_id معها ، ثم يقوم جزء Java بتنفيذ سلسلة من المعالجة ، ثم يقوم بتغليف البيانات المختلفة التي يتطلبها كل عميل وإرجاعها. يجب أن يكون للبيانات التي تم إرجاعها علاقة مقابلة مع Socket_id. وبهذه الطريقة ، عندما يتلقى خادم Node.js البيانات المرسلة بواسطة TomCat ، يتم توزيعها على عملاء مختلفين بواسطة مقبس مختلف من خلال جدول رسم الخرائط المذكور أعلاه.
رمز خادم Node.js:
var http = require ('http') ، net = require ('net') ، app = http.createserver (). الاستماع ('8181') ، io = require ('socket.io'). الاستماع (app) ، nondeserver = net.socket () ؛ // الاتصال بـ Tomcat Noveserver.connect (8007 ، '127.0.0.1' ، function () {console.log ('connection') ؛}) ؛ // تخزين مثيل اتصال WebSocket الخاص بالعميل var asocket = {} ؛ // قم بإنشاء اتصال مع العميل io.sockets.on ('connection' ، function (socketio) {// استلام البيانات من العميل وأرسله إلى tomcat socketio.on ('fromWebClient' ، function (webClientData) {// store to tomcate [scooceio.id] = socketio ؛ // add Socketio.id ؛ }) ؛ // تلقي البيانات من tomcat noveserver.on ('data' ، function (data) {var jsondata = json.parse (data.toString ()) ؛ // توزيع البيانات على العميل لـ (var i في jsondata.list) {asocket [jsondata.list [i] ['sid']]. jsondata.list [i] .data) ؛يتم حذف الكود أعلاه بعض المنطق ، مثل البيانات التي يتلقاها خادم Node.js من Tomcat مقسمة إلى نوعين ، والآخر هو البيانات التي يتم دفعها ، والآخر هو البيانات التي تستجيب للطلب. هنا ، تتم معالجة البيانات التي تم دفعها بشكل موحد.
عند معالجة الاتصالات ، تكون البيانات المرسلة بواسطة Node.js إلى tomcat بتنسيق السلسلة ، والبيانات المستلمة من Tomcat هي كائن عازلة (ثمانية بايت) ، والتي يجب تحويلها إلى سلسلة ثم تحويلها إلى JSON وإرسالها إلى العميل.
تعطي هذه المقالة فقط مثالًا بسيطًا على مثل هذه الاتصالات ، ويجب إضافة العديد من الأشياء إلى الأعمال المحددة. نظرًا لأن Node.js يتم تقديمه في المشروع ، فإن الواجهة الأمامية تحتاج إلى القيام بمزيد من الأشياء ، مثل المعالجة والتخزين المؤقت وحتى إضافة الكثير من منطق العمل.