مع تطوير الإنترنت ، كان من الصعب تلبية بروتوكولات HTTP التقليدية للاحتياجات المعقدة بشكل متزايد لتطبيقات الويب. في السنوات الأخيرة ، مع ولادة HTML5 ، تم اقتراح بروتوكول WebSocket. إنه يدرك التواصل الكامل بين المتصفح والخادم ، ويقوم بتوسيع وظيفة الاتصال بين المتصفح والخادم ، ويمكّن الخادم من إرسال البيانات بنشاط إلى العميل.
بروتوكول HTTP التقليدي عديمة الجنسية. يجب أن يبدأ العميل كل طلب (مثل المتصفح). بعد المعالجة ، يقوم الخادم بإرجاع نتيجة الاستجابة. من الصعب على الخادم إرسال البيانات بنشاط إلى العميل. هذا النوع من نموذج الويب التقليدي هو استباقي والخادم هو السلبي. يؤدي نموذج الويب التقليدي إلى متاعب أقل لتطبيقات الويب مع تغييرات المعلومات النادرة ، ولكنه يجلب إزعاجًا كبيرًا لتطبيقات الويب التي تتضمن معلومات في الوقت الفعلي ، مثل التطبيقات التي لها وظائف مثل الاتصالات الفورية ، وبيانات الوقت الفعلي ، ودفع الاشتراك ، وما إلى ذلك قبل اقتراح مواصفات WebSocket ، وغالبًا ما يستخدم المطورون حلول المقايضة هذه في الوقت الحقيقي للغاية: استطلاعات التصوير وبيانات الرسوم الهزلية. في الواقع ، هذا الأخير هو في الأساس نوع من الاقتراع ، ولكن تم تحسينه.
الاقتراع هو الحل الأكثر أصالة لتنفيذ تطبيقات الويب في الوقت الفعلي. تتطلب تقنية الاقتراع من العملاء إرسال طلبات إلى الخادم بشكل دوري في فترة زمنية محددة وغالبًا ما تستفسر عما إذا كانت هناك تغييرات جديدة في البيانات. من الواضح أن هذا النهج يمكن أن يؤدي إلى الكثير من الطلبات غير الضرورية ، وإهدار حركة المرور وموارد الخادم.
يمكن تقسيم تكنولوجيا المذنب إلى تقنية الاقتراع والبث الطويلة. يؤدي الاقتراع الطويل إلى تحسين تكنولوجيا الاقتراع المذكورة أعلاه ، مما يقلل من الطلبات عديمة الفائدة. يضع وقت انتهاء الصلاحية لبيانات معينة ، ويرسل طلبًا فقط إلى الخادم بعد انتهاء صلاحية البيانات ؛ هذه الآلية مناسبة للحالات التي لا تكون فيها تغييرات البيانات متكررة بشكل خاص. تشير تقنية البث عادة إلى العميل باستخدام نافذة مخفية لإنشاء اتصال طويل HTTP مع الخادم. سيقوم الخادم بتحديث حالة الاتصال باستمرار للحفاظ على اتصال HTTP طويلًا على قيد الحياة ؛ وبهذه الطريقة ، يمكن للخادم إرسال البيانات بنشاط إلى العميل من خلال هذا الاتصال الطويل ؛ قد تختبر تقنية التدفق أداء الخادم في بيئة تزامن كبيرة.
تعتمد كلتا التقنيتين على وضع الاستجابة للطلب ولا يعتبران تقنيات في الوقت الفعلي بالمعنى الحقيقي ؛ كل طلب أو استجابة لسفراتهم كمية معينة من حركة المرور على نفس معلومات الرأس ، وتعقيد التطوير مرتفع أيضًا.
** إلى جانب إطلاق HTML5 ، يدرك WebSocket حقًا التواصل في الوقت الفعلي للويب ، مما يجعل وضع B/S لديه إمكانيات اتصال في الوقت الفعلي لوضع C/S. ** سير عمل WebSocket كما يلي: يرسل المتصفح طلبًا إلى الخادم لإنشاء اتصال WebSocket عبر JavaScript. بعد إنشاء اتصال WebSocket بنجاح ، يمكن للعميل والخادم نقل البيانات من خلال اتصال TCP. نظرًا لأن اتصال WebSocket هو في الأساس اتصال TCP ، فإنه لا يتطلب نقل بيانات الرأس المتكررة مع كل ناقل حركة ، وبالتالي فإن حجم نقل البيانات الخاص به أصغر بكثير من تقنية الاقتراع وتكنولوجيا المذنب. لا تقدم هذه المقالة مواصفات WebSocket بالتفصيل ، ولكنها تقدم بشكل أساسي تنفيذ WebSocket في Java Web ، وتستخدم WebSocket لتنفيذ غرفة الدردشة.
قام Javaee 7 بإنشاء JSR-356: Java API لمواصفات WebSocket. العديد من حاويات الويب ، مثل Tomcat و Nginx و Jetty ، وما إلى ذلك ، تدعم WebSocket. يدعم Tomcat WebSocket منذ 7.0.27 و JSR-356 منذ 7.0.47. يجب أيضًا تشغيل الرمز التالي على Tomcat7.0.27 أو أعلى.
رمز خادم WebSocket
// يتم استخدام هذا التعليق التوضيحي لتحديد URI ، من خلاله يمكن للعميل الاتصال بـ WebSocket. رسم توضيحي يشبه servlet. لا حاجة لتكوينه في web.xml. serverEndPoint ("/websocket") الفئة العامة websocketdemo {// متغير ثابت يستخدم لتسجيل العدد الحالي للاتصالات عبر الإنترنت. يجب أن تكون مصممة لتكون آمنة الخيط. خاص ثابت Atomicinteger onlinecount = new AtomicInteger (0) ؛ // يتم استخدام مجموعة مؤشرات الترابط الآمنة للحزمة المتزامنة لتخزين كائن MyWebsocket المقابل لكل عميل. لإدراك أن الخادم يتواصل مع عميل واحد ، يمكنك استخدام MAP لتخزينه ، حيث يمكن للمفتاح تحديد مستخدم CopyWriteArrayset الخاص بالمستخدم <WebSocketDemo> websocketset = new copyOnWriteArrayset <BebocketDemo> () ؛ // تحديد لقب الدردشة الذي يسجل لقب السلسلة النهائية للعميل ؛ // قم بتوصيل جلسة اتصال مع عميل معين ، وتحتاج إلى إرسال بيانات إلى جلسة الجلسة الخاصة العميل ؛ public WebSocketDemo () {nobegr = "guest" + onlinecount.getandincrement () ؛ } / * * استخدم تعليق توضيحي @onopen للإشارة إلى الإرجاع بعد نجاح رابط العميل. جلسة المعلمة هي معلمة اختيارية هذه الجلسة هي جلسة في مواصفات WebSocket ، التي تمثل جلسة. not httpsession */ onopen public void onopen (جلسة الجلسة) {this.session = session ؛ websocketset.add (هذا) ؛ رسالة السلسلة = string.format ("[٪ s ، ٪ s]" ، لقب ، "إضافة إلى غرفة الدردشة") ؛ البث (رسالة) ؛ System.out.println ("OnoPen") ؛ }/ * * استخدم التعليق التوضيحي onmessage للإشارة إلى متى يرسل العميل رسالة وتشير المعلمة الأولى إلى البيانات المرسلة من قبل المستخدم. جلسة المعلمة هي معلمة اختيارية ، والتي تتوافق مع الجلسة في طريقة OnoPen */onMessage public void onMessage (رسالة سلسلة ، جلسة الجلسة) {// بالطبع true system.out.println (this.session == session) ؛ Broadcast (string.format ("٪ s: ٪ s" ، لقب ، مرشح (رسالة))) ؛ }/ ** رد الاتصال بعد أن يكسر المستخدم الرابط ، لاحظ أنه يجب استدعاء هذه الطريقة بعد استدعاء العميل طريقة الارتباط المكسور*/ OonClose public void onClose () {websocketset.remove (this) ؛ رسالة السلسلة = string.format ("[٪ s ، ٪ s]" ، لقب ، "اترك رابط غرفة الدردشة") ؛ البث (رسالة) ؛ }. }} catch (ioException e) {system.out.println ("إرسال رسالة إلى العميل"+w.nickname+"فشل في إرسال رسالة") ؛ websocketset.remove (w) ؛ حاول {W.Session.Close () ؛ } catch (ioException e1) {} message = string.format ("[٪ s ، ٪ s]" ، w.nickname ، "disconnected") ؛ البث (رسالة) ؛ }}} // يمكنه تقديم بعض طلبات التصفية لرسائل المستخدم ، مثل حظر الكلمات الرئيسية ، وما إلى ذلك. . مرشح السلسلة الثابتة العامة (رسالة سلسلة) {if (message == null) {return null ؛ } رسالة الإرجاع ؛ }}رمز العميل (صفحة الويب الرئيسية):
<! doctype html> <html> <head> <meta charset = "utf-8"> <title> إدراج العنوان هنا </title> <script type = "text/javaScript"> var ws = new WebSocket ("ws: // localhost: 8080/websockettest/websocket") ؛ / * * استمع إلى التغييرات في الحالات الثلاث. سوف JS رد الاتصال*/ ws.onopen = دالة (رسالة) {} ؛ ws.onclose = function (message) {} ؛ ws.onmessage = function (message) {showMessage (message.data) ؛ } ؛ // استمع إلى حدث إغلاق النافذة. عند إغلاق النافذة ، تغلق بشكل نشط اتصال WebSocket لمنع الإغلاق قبل فصل الاتصال ، وسيقوم جانب الخادم بإلقاء استثناءات. window.onbeforeUnload = function () {ws.Close () ؛ } ؛ // أغلق وظيفة الاتصال CloseWebSocket () {ws.close () ؛ } // إرسال وظيفة الرسالة send () {var input = document.getElementById ("msg") ؛ var text = input.value ؛ ws.send (نص) ؛ input.value = "" ؛ } وظيفة showMessage (message) {var text = document.createTextNode (message) ؛ var br = document.createElement ("br") var div = document.getElementById ("showchatmessage") ؛ div.AppendChild (text) ؛ Div.AppendChild (BR) ؛ } </script> </head> <body> <div id = "show"> <div id = "showchatmessage"> </viv> <input type = "text" size = "80" id = "msg" name = "msg" placebn = "enter chat content"/> <input type = "send" = "sendbn" OnClick = "send ()"> </body> </html>كما ذكر أعلاه ، تم الانتهاء من غرفة الدردشة مع وظيفة الدردشة الجماعية. أثناء عملية التحقق ، وجد أن باستخدام WebSocket يمكنه إكمال طلبات المجال المتقاطع.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.