1. مقدمة موجزة إلى WebSocket
مع تطوير الإنترنت ، كان من الصعب تلبية بروتوكولات HTTP التقليدية للاحتياجات المعقدة بشكل متزايد لتطبيقات الويب. في السنوات الأخيرة ، مع ولادة HTML5 ، تم اقتراح بروتوكول WebSocket. إنه يدرك التواصل الكامل بين المتصفح والخادم ، ويقوم بتوسيع وظيفة الاتصال بين المتصفح والخادم ، ويمكّن الخادم من إرسال البيانات بنشاط إلى العميل.
نحن نعلم أن بروتوكول HTTP التقليدي عديمة الجنسية. يجب أن يبدأ العميل كل طلب (مثل المتصفح). بعد المعالجة ، يقوم الخادم بإرجاع نتيجة الاستجابة. من الصعب على الخادم إرسال البيانات بنشاط إلى العميل. هذا النوع من العميل هو الطرف النشط والخادم هو الطرف السلبي. يؤدي نموذج الويب التقليدي إلى متاعب أقل لتطبيقات الويب مع تغييرات المعلومات النادرة ، ولكنه يجلب إزعاجًا كبيرًا لتطبيقات الويب التي تتضمن معلومات في الوقت الفعلي ، مثل التطبيقات التي لها وظائف مثل الاتصالات الفورية ، وبيانات الوقت الفعلي ، ودفع الاشتراك ، وما إلى ذلك قبل اقتراح مواصفات WebSocket ، وغالبًا ما يستخدم المطورون حلول المقايضة هذه في الوقت الحقيقي للغاية: استطلاعات التصوير وبيانات الرسوم الهزلية. في الواقع ، هذا الأخير هو في الأساس نوع من الاقتراع ، ولكن تم تحسينه.
الاقتراع هو الحل الأكثر أصالة لتنفيذ تطبيقات الويب في الوقت الفعلي. تتطلب تقنية الاقتراع من العملاء إرسال طلبات إلى الخادم بشكل دوري في فترة زمنية محددة وغالبًا ما تستفسر عما إذا كانت هناك تغييرات جديدة في البيانات. من الواضح أن هذا النهج يمكن أن يؤدي إلى الكثير من الطلبات غير الضرورية ، وإهدار حركة المرور وموارد الخادم.
يمكن تقسيم تكنولوجيا المذنب إلى تقنية الاقتراع والبث الطويلة. يؤدي الاقتراع الطويل إلى تحسين تكنولوجيا الاقتراع المذكورة أعلاه ، مما يقلل من الطلبات عديمة الفائدة. يضع وقت انتهاء الصلاحية لبيانات معينة ، ويرسل طلبًا فقط إلى الخادم بعد انتهاء صلاحية البيانات ؛ هذه الآلية مناسبة للحالات التي لا تكون فيها تغييرات البيانات متكررة بشكل خاص. تشير تقنية البث عادة إلى العميل باستخدام نافذة مخفية لإنشاء اتصال طويل HTTP مع الخادم. سيقوم الخادم بتحديث حالة الاتصال باستمرار للحفاظ على اتصال HTTP طويلًا على قيد الحياة ؛ وبهذه الطريقة ، يمكن للخادم إرسال البيانات بنشاط إلى العميل من خلال هذا الاتصال الطويل ؛ قد تختبر تقنية التدفق أداء الخادم في بيئة تزامن كبيرة.
تعتمد كلتا التقنيتين على وضع الاستجابة للطلب ولا يعتبران تقنيات في الوقت الفعلي بالمعنى الحقيقي ؛ كل طلب أو استجابة لسفراتهم كمية معينة من حركة المرور على نفس معلومات الرأس ، وتعقيد التطوير مرتفع أيضًا.
مع إطلاق HTML5 ، يدرك WebSocket حقًا الاتصال في الوقت الفعلي بالويب ، مما يجعل وضع B/S لديه إمكانيات اتصال في الوقت الفعلي لوضع C/S. سير عمل WebSocket كما يلي: يرسل المتصفح طلبًا إلى الخادم لإنشاء اتصال WebSocket عبر JavaScript. بعد إنشاء اتصال WebSocket بنجاح ، يمكن للعميل والخادم نقل البيانات من خلال اتصال TCP. نظرًا لأن اتصال WebSocket هو في الأساس اتصال TCP ، فإنه لا يتطلب نقل بيانات الرأس المتكررة مع كل ناقل حركة ، وبالتالي فإن حجم نقل البيانات الخاص به أصغر بكثير من تقنية الاقتراع وتكنولوجيا المذنب. لا تقدم هذه المقالة مواصفات WebSocket بالتفصيل ، ولكنها تقدم بشكل أساسي تنفيذ WebSocket في Java Web.
قام Javaee 7 بإنشاء JSR-356: Java API لمواصفات WebSocket. العديد من حاويات الويب ، مثل Tomcat و Nginx و Jetty ، وما إلى ذلك ، تدعم WebSocket. يدعم Tomcat WebSocket منذ 7.0.27 و JSR-356 منذ 7.0.47. يجب أيضًا نشر الرمز التجريبي التالي على tomcat7.0.47 أو أعلى للتشغيل.
رمز العميل (صفحة الويب الرئيسية):
<٪@ page language = "java" pageencoding = "utf-8" ٪> <! doctype html> <html> <head> <head> tomcat تطبيق java backend websocket </title> </head> OnClick = "CloseWebsocket ()"> أغلق اتصال WebSocket </button> <hr/> <div id = "message"> </viv> </body> <script type = "text/javaScript"> var websocket = null ؛ // تحكم على ما إذا كان المتصفح الحالي يدعم WebSocket إذا ("WebSocket" في النافذة) {WebSocket = جديد WebSocket ("WS: //172.16.98.31: 8080/WebSocket/WebSocket") ؛ } آخر {Alert ('المستعرض الحالي لا يدعم WebSocket') ؛ }. } ؛ // طريقة رد الاتصال للاتصال الناجح websocket.onopen = function () {setMessageInnerHtml ("WebSocket Connection Success") ؛ }. }. } // استمع إلى حدث إغلاق النافذة. عند إغلاق النافذة ، تغلق بشكل نشط اتصال WebSocket لمنع الإغلاق قبل فصل الاتصال ، وسيقوم جانب الخادم بإلقاء استثناءات. window.onbeforeUnload = function () {closeWebSocket () ؛ }. } // أغلق وظيفة اتصال WebSocket CloseWebSocket () {websocket.close () ؛ } // إرسال وظيفة الرسالة send () {var message = document.getElementById ('text'). value ؛ websocket.send (message) ؛ } </script> </html> رمز خلفية الويب Java
package cn.com ؛ import java.io.ioException ؛ استيراد java.util.concurrent.copyonwritearrayset ؛ استيراد javax.websocket. تتمثل وظيفتها بشكل أساسي في تحديد الفئة الحالية كجانب خادم WebSocket. * سيتم استخدام قيمة التعليقات التوضيحية للاستماع إلى اتصال المستخدم بعنوان عنوان URL للوصول الطرفي. يمكن للعميل الاتصال بجانب WebSocket Server من خلال عنوان URL* في كل مرة يتم تقديم طلب ، سيتم إنشاء مثيل*/@serverendpoint ("/websocket") يتم استخدام متغيرات WebSockettest {// الثابتة لتسجيل العدد الحالي للاتصالات عبر الإنترنت. يجب أن تكون مصممة لتكون آمنة الخيط. ثابت خاص int onlinecount = 0 ؛ // يتم استخدام مجموعة مؤشرات الترابط الآمنة للحزمة المتزامنة لتخزين كائن MyWebsocket المقابل لكل عميل. لإدراك أن الخادم يتواصل مع عميل واحد ، يمكنك استخدام MAP لتخزينه ، حيث يمكن للمفتاح تحديد مستخدم CopleDwriteArrayset الثابتة الخاصة بـ WebSocketTest> WebSocketSet = New CopyOnWriteArrayset <Bebsockettest> () ؛ // تحتاج جلسة الاتصال مع عميل معين إلى إرسال بيانات إلى العميل من خلال جلسة جلسة خاصة تكنولوجيا المعلومات ؛ /*** طريقة لاتصالات الاتصال بنجاح* param جلسة معلمة اختيارية. الجلسة هي جلسة اتصال مع عميل ، وتحتاج إلى إرسال بيانات إلى العميل من خلاله*/ onopen public void onopen (جلسة الجلسة) {this.session = session ؛ websocketset.add (هذا) ؛ // إضافة إلى addonLinEcount () في set ؛ // أضف 1 نظام رقم عبر الإنترنت. } / *** طريقة لتوصيل المكالمات الختامية* / onclose public void onClose () {websocketset.remove (this) ؛ // delete subonlinecount () من set ؛ // حذف الرقم عبر الإنترنت بواسطة 1 نظام أرقام عبر الإنترنت. } / *** الطريقة التي تسمى بعد استلام رسالة العميل* param رسالة المرسلة من العميل* param جلسة المعلمة الاختيارية* / onmessage public void onMessage (رسالة سلسلة ، جلسة الجلسة) {system.out.println ("رسالة من العميل:" + رسالة) ؛ // Message Patch لـ (WebSockettest العنصر: WebSocketset) {try {item.sendMessage (message) ؛ } catch (ioException e) {E.PrintStackTrace () ؛ يكمل؛ }}}} / ** * الاتصال عند حدوث خطأ * param جلسة * param error * / onerror public void onerror (جلسة الجلسة ، الخطأ القابل للتخفيف) {system.out.println ("حدث خطأ") ؛ error.printStackTrace () ؛ } /*** هذه الطريقة تختلف عن الطرق المذكورة أعلاه. لا يوجد أي شرح ، إنها طريقة تمت إضافتها وفقًا لاحتياجاتك. * param message * throws ioException */ public void sendMessage (رسالة سلسلة) يلقي ioException {this.session.getBasicRemote (). sendText (message) ؛ //this.session.getAsyncremote().SendText(message) ؛ } static static synchronized int getOnlinEcount () {return onlinecount ؛ ) ) }}افتح متصفحين ، أدخل عنوان URL ، وقم بتشغيله مباشرة
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.