كيفية تنفيذ WebSocket في Tomcat
ينتمي بروتوكول WebSocket إلى معيار HTML5 ، ويحصل المزيد والمزيد من المتصفحات على WebSocket ، مما يتيح للعملاء والخوادم تحقيق اتصال ثنائي الاتجاه. بعد إنشاء اتصال WebSocket بين العميل والخادم ، يمكن إرسال رسالة من جانب الخادم مباشرة إلى العميل ، وبالتالي كسر وضع استجابة الطلب التقليدي وتجنب طلبات لا معنى لها. على سبيل المثال ، قد تستخدم الطريقة التقليدية Ajax لطلب جانب الخادم بشكل مستمر ، بينما يمكن لـ WebSocket إرسال البيانات مباشرة إلى العميل ولا يتعين على العميل طلبها. في الوقت نفسه ، بفضل دعم المتصفح الأصلي ، أصبحت كتابة تطبيقات العميل أكثر ملاءمة ولا حاجة إلى الاعتماد على المكونات الإضافية لجهة خارجية. بالإضافة إلى ذلك ، يتخلى بروتوكول WebSocket عن رؤوس الطلبات المرهقة لبروتوكول HTTP ، ولكنه ينقله في شكل إطارات بيانات ، وهو أكثر كفاءة.
تعرض الصورة عملية اتصال بروتوكول WebSocket. أولاً ، سيرسل العميل حزمة مصافحة لإخبار الخادم بأنني أرغب في الترقية إلى WebSocket. لا أعرف ما إذا كان الخادم الخاص بك يوافق. في هذا الوقت ، إذا كان الخادم يدعم بروتوكول WebSocket ، فسيقوم بإرجاع حزمة مصافحة لإخبار العميل أنه لا توجد مشكلة وأن الترقية قد تم تأكيدها. ثم تم إنشاء اتصال WebSocket بنجاح ، والذي يدعم الاتصال في اتجاهين ويرسل رسائل باستخدام تنسيق إطار البيانات لبروتوكول WebSocket.
يجب شرح عملية المصافحة. من أجل جعل بروتوكول WebSocket متوافقًا مع بنية الويب HTTP الحالية ، يجب أن تعتمد مصافحة بروتوكول WebSocket على بروتوكول HTTP. على سبيل المثال ، سيرسل العميل رسائل HTTP مماثلة لطلب الخادم للترقية إلى بروتوكول WebSocket. الترقية: يخبر WebSocket الخادم بأنني أريد ترقية البروتوكول:
احصل على ws: // localhost: 8080/hello http/1.1 الأصل: http: // localhost: 8080 الاتصال: ترقية المضيف: localhost: 8080 sec-websocket-key: urovsczjnol
في هذا الوقت ، إذا كان الخادم يدعم بروتوكول WebSocket ، فسوف يرسل رسالة توافق على بروتوكول ترقية العميل. تشبه الرسالة المحددة ما يلي ، حيث ترقية: يخبر WebSocket العميل بأنني أوافق على بروتوكول الترقية الخاص بك:
HTTP/1.1 101 WebSocket بروتوكول المصافحة التاريخ: FRI ، 10 فبراير 2016 17:38:18 اتصال GMT: خادم الترقية: Kaazing Gateway ترقية: WebSocket Sec-Websocket-Accep
بعد الانتهاء من المصافحة على النحو الوارد أعلاه ، يتم كسر اتصال بروتوكول HTTP. بعد ذلك ، تبدأ في استخدام بروتوكول WebSocket للتواصل بين الطرفين. لا يزال هذا الاتصال هو اتصال TCP/IP الأصلي ، ولا يزال المنفذ هو 80 أو 443 الأصلي.
فيما يلي مثال بسيط لكتابة WebSocket في Tomcat:
يمتد HelloWebEbsOcketServlet من الفئة العامة {قائمة ثابتة خاصة <ChisalBound> SocketList = new ArrayList <MessageInBound> () ؛ StreamInbound CreateWebSocketInbound (سلسلة subprotocol ، httpservletrequest طلب) {إرجاع WebSocketMessageInBound () ؛ } الفئة العامة WebSocketMessageInbound يمتد MessageInBound {protected void onClose (int status) {super.onclose (status) ؛ SocketList.remove (هذا) ؛ } void void onopen (wsoutbound خارج) {super.onopen (خارج) ؛ SocketList.add (هذا) ؛ } override void onBinaryMessage (رسالة bytebuffer) يلقي ioException {} override void ontextmessage (رسالة charbuffer) يلقي ioException {for (messageInbound MessageInbound: socketlist) {Charbuffer Buffer = Charbuffer.wrap (message) ؛ wsoutBound Outbound = messageInbound.getWsoutBound () ؛ outbound.writeTextMessage (المخزن المؤقت) ؛ outbound.flush () ؛ }}}}يجب أن يرث هذا servlet جهاز WebSocketServlet ، ثم إنشاء فئة WebSocketMessageInBound ترث MessageInbound. تملأ Onclose ، onopen ، onbinarymessage و ontextMessage في هذه الفئة لإكمال منطق كل حدث. سيتم استدعاء OnoPen عند إنشاء اتصال WebSocket ، وسيتم استدعاء OnClose عند إغلاق WebSocket ، ويتم استدعاء OnBinaryMessage عند استلام بيانات العميل في الوضع الثنائي ، ويتم استدعاء onTextMessage عند استلام بيانات العميل في وضع النص. الرمز أعلاه ينفذ تأثير البث.
وفقًا لمنطق المعالجة أعلاه ، لن يكون تكامل Tomcat لـ WebSocket أمرًا صعبًا للغاية. وهذا يعني أنه إذا واجهت طلبًا لبروتوكول WebSocket عند معالجة الطلب ، فستقوم بمعالجة خاصة ، والحفاظ على الاتصال والاتصال بطرق OnClose ، و Ponopen ، و OnbinaryMessage و onTextMessage لطرق MessageinBound الخاصة بـ WebSocketServlet في الوقت المناسب. نظرًا لأن WebSocket يوصى باستخدامه بشكل عام في وضع NIO ، انظر إلى بروتوكول WebSocket لتكامل وضع NIO.
كما هو موضح في الشكل ، إذا تم استلام اتصال عميل WebSocket بواسطة المتلقي وتسجيله في قائمة انتظار Niochannel ، فإن مكون Poller يستمر في الاستراحة على ما إذا كانت هناك niochannel للتعامل معها. إذا كان الأمر كذلك ، فسوف يمر عبر خط أنابيب المعالجة إلى servlet يرث websocketservlet. ستتعامل طريقة DOGE الخاصة بـ WebSocketServlet مع مصافحة WebSocket وطلب عميل الإرجاع للموافقة على اتفاقية الترقية. في وقت لاحق ، واصل Poller التناوب لخلع niochannel ذات الصلة. بمجرد اكتشاف أنه تم استخدام خط الأنابيب باستخدام بروتوكول WebSocket ، فإنه سيطلق على طريقة MessageInbound لإكمال معالجة الأحداث المختلفة ، وبالتالي تحقيق الدعم لبروتوكول WebSocket.
شكرا لك على القراءة ، آمل أن تساعدك. شكرا لك على دعمك لهذا الموقع!