البرنامج التعليمي التالي هو نظام CRM للشركة شاركت في تطوير شركة ، وفرز بعض المعلومات ذات الصلة. هناك العديد من وظائف دفع الرسائل في النظام ، ويتم استخدام تقنية WebSocket فيه. قام المحرر التالي بتجميعه وشاركه على منصة شبكة Wulin للرجوع إليه
1. تبعية مافن
<Rependency> <roupiD> javax.servlet </groupId> <StifactId> javax.servlet-api </stifactid> <splection> 3.1.0 </version> </sependency> <redency> <roupiD> com.fasterxml.jackson.core </groupid> <terifactid> Jackson-core </atsiD> 0 </version> </sependency> <reperency> <roupiD> com.fasterxml.jackson.core </groupId> <ArtifactId> Jackson-Core </stifactid> <sored> 2.3.0 </version> </reperency> <redency> <roupencid> com.fasterxml.jackson.core </groupid> -dataBind </stifactid> <sople> 2.3.0 </version> </sependency> <reperence> <roupiD> org.springframework </rougeid> <StifactId> Spring-Websocket </stifactid> <splement> 4.0.1. الإصدار </version> </sependency> <reperency> <roupiD> org.springframework </rougled> <StifactId> spring-messaging </shintifactid> <splection> 4.0.1.release </version> </sependency>
2. تكوين SPRING-SERVELL
<؟ xmlns = "http://www.springframework.org/schema/beans" ext "xmlns: mvc =" http://www.springframework.org/schema/mvc "xmlns: tx =" http://www.springframework.org/schema/tx " Xmlns: XSI = "http://www.w3 .springframework.org/schema/beanshttp: //www.springframework.org/schema/beans/spring-beans-3.1.xsdhttp: //www.springframework.org/schema/context/spring -context -3.1.xsdhtp: //www.springframework.org/schema/mvchttp: //www.springframework.o RG/SCEMA/MVC/Spring-MVC-33.1.xsdhtp: //www.springframework.org/schema/txhttp: //www.spr ingframework.org/schema/tx/spring-tx-3.1.xsdhtp://www.springframework.org/schema/websocketttp://www.springframework.org/schema/websocket/sbring-webocket.xsd"> id = "websocket"/> <WebSocket: معالجات> <WebSocket: Mapping Path = "/WebSocket" Handler = "WebSocket"/> <WebSocket: مصافحة مستقبلات> <bean/> <WebSocket: Handshake-Interceptors> </bordsocket: معالجات> </beans>
من بينها ، المسار المقابل للمسار هو مسار الواجهة الذي تم ضبطه من خلال بروتوكول WS في القسم السابق.
3. تنفيذ المصافحة
package cn.bridgeli.websocket ؛ استيراد cn.bridgeli.utils.usermanager ؛ استيراد cn.bridgeli.util.dateutil ؛ استيراد cn.bridgeli.sharesession.userinfo org.slf4j.loggerfactory ؛ استيراد org.springframework.http.server.serverhttprequest ؛ استيراد org.springframework.http.server.serverhttprespons org.springframework.web.context.request.servletrequestattributes ؛ استيراد org.springframework.web.socket.websockethandler ؛ استيراد org.springframework.web.socket.server.support.httpsessionhandhandshakeAntersproctove ؛ java.util.map ؛/*** description: إنشاء واجهة مصافحة*date: 16-3-3*/public class public intershipetor يمتد httpsessionhandshakeInterceptor طلب ، استجابة serverhttpresponse ، websockethandler wshandler ، خريطة <سلسلة ، كائن> سمات) يلقي الاستثناء {logger.info ("قبل إنشاء مصافحة ...") usermanager.getSessionUser (attrs.getRequest ()) ؛ userSocketVo userSocketVo = new ustervouctocketvo () ؛ string email = "" DATE () attributes.put ("session_user" ، userSocketVo) ؛ return super.beforehandshake (طلب ، استجابة ، wshandler ، السمات) ؛}@overridepublic void بعد ذلكلأنني لا أفهم جيدًا ، أحتفظ بالرمز الأصلي إلى أقصى حد. هذا هو في الواقع إخراج مستخدم تسجيل الدخول الحالي من تسجيل الدخول المفرد ، وتحويله إلى كائن stervesocketVo ، ووضعه في الخريطة. لذلك دعونا نلقي نظرة على تعريف كائن UsperSocketVo
4. تعريف المستخدمين
حزمة cn.bridgeli.websocket ؛ استيراد org.springframework.web.socket.websocketsession ؛ استيراد java.util.date ؛/*** decription: كيان اتصال مستخدم مستخدم*date: 16-3-7*/فئة عامة userboocketvo {private string usermail ؛ // البريد الإلكتروني للمستخدم وقت التوصيل الخاص ؛ // وقت اتصال ناجح تاريخ خاص prerequesttime ؛ //آخر طلب وقت التاريخ الخاص NewRequestTime ؛ // وقت طلب جديد تاريخ خاص lastsendtime = تاريخ جديد () ؛ . // آخر وقت إرسال للمهمة المعلقة WebSocketsession WebSocketSession ؛ .أهمها هي خاصية WebSocketSession ، والتي سنستخدمها لاحقًا
5. تنفيذ WebSocketEndPoint
package cn.bridgeli.websocket ؛ استيراد org.slf4j.logger ؛ استيراد org.slf4j.loggerfactory ؛ استيراد org.springframework.beans.factory.annotation.autowire org.springframework.web.socket.textMessage ؛ استيراد org.springframework.web.socket.websocketsession ؛ استيراد org.springframework.web.socket.handler.textwebsockandler ؛ textWebsockethandler {private static final logger logger = loggerfactory.getLogger (WebSocketEndPoint.class) ؛@AutoWiredPrivat textMessage (message.getPayload ()+"تم استلامه في الخادم") (userSocketVo) session.getattributes (). get ("session_user") ؛ if (null! = userSocketVo) {userSocketVo.setWebsOcketSession (Session) ؛ if (wssessionLocalcache.exists (userSocketVo.getuserEmail ()))) userSocketVo) ؛ newslistener.afterConnectionEstablished (usersoCketVo.getuserEmail ()) ؛} logger.info ("التوصيل الذي تم إنشاؤه بنجاح ...") ؛ super.afterConnectionEstablishableSistablished (sessions) (userSocketVo) session.getattributes (). get ("session_user") ؛ if (null! = userSocketVo) {wsSessionLocalcache.Remove (userSocketVo.getuseremail ()) ؛6. تنفيذ wssessionlocalcache
package cn.bridgeli.websocket ؛ استيراد java.io.serializable ؛ استيراد java.util.arraylist ؛ استيراد java.util.hashmap ؛ استيراد java.util.list {الخريطة الثابتة الخاصة <string ، userSOCKETVO> wssessessioncache = new hashmap <> () ؛ static boolean public موجود (useremail string) {if (! wssessessioncache.containskey (useremail)) {return false ؛ userSocketVo) {wsSessionCache.put (UserEmail ، userSocketVo) ؛} static static staticocebutvo get (string useremail) {return wssessioncache.get (useremail) ؛ ArrayList <> (wssessioncache.values ()) ؛}}بعد النظر في تنفيذها ، يكون التأثير أكثر وضوحًا. يقوم بتخزين أحدث بيانات لكل مستخدمين. في الواقع ، تم حساب تطبيق WebSocket الخاص بنا هنا ، ولكن لا يزال هناك فئة أساسية (فئة Charlie حول منطق العمل) لم يتم تنفيذها. في المقالة التالية ، مثال تطبيق WebSocket المدمج في Spring (الجزء 2) ، سنرى كيفية تنفيذ هذه الفئة.
مقدمة لبروتوكول WebSocket
يعد بروتوكول WebSocket وظيفة مهمة في حقل الويب المحدد بواسطة مواصفات RFC-6455: Duplex الكاملة ، أي الاتصال ثنائي الاتجاه بين العميل والخادم. إنها ميزة مثيرة. كانت الصناعة تستكشف هذا المجال لفترة طويلة. تشمل التقنيات المستخدمة Java Applet و XmlHttPrequest و Adobe Flash و ActiveXobject و Technologies المختلفة ومختلف أحداث إرسال الخادم ، إلخ ، إلخ.
يجب أن يكون من المفهوم أنه قبل استخدام بروتوكول WebSocket ، تحتاج إلى استخدام بروتوكول HTTP لبناء المصافحة الأولية. هذا يعتمد على آلية - إنشاء HTTP وطلب ترقيات البروتوكول (أو تحويلات البروتوكول). عندما يوافق الخادم ، سيستجيب على رمز حالة HTTP 101 ، مما يشير إلى أنه يوافق على تبديل البروتوكول. على افتراض أن المصافحة الناجحة من خلال مآخذ TCP وطلب ترقية بروتوكول HTTP يتم تمريرها ، يمكن لكل من العميل والخادم إرسال رسائل إلى بعضها البعض.
قدم Spring Framework 4.0 وما فوق وحدة نمطية جديدة ، وهي وحدة SPRING Websocket. يوفر الدعم لاتصالات WebSocket. إنه متوافق مع مواصفات Java WebSocket API JSR-356 ، مع توفير وظائف إضافية.
في أي سيناريو يجب أن تستخدم WebSocket
في تطبيقات الويب ، عندما يحتاج العميل والخادم إلى تبادل الأحداث بتردد أعلى ودرجة زمن انتقال أقل ، فهو مناسب لـ WebSocket. لذلك ، فإن WebSocket مناسب لسيناريوهات التطبيق مثل التمويل والألعاب والتعاون.
قد لا يكون مناسبًا لسيناريوهات التطبيق الأخرى. على سبيل المثال ، يتطلب اشتراك الأخبار عرض الأخبار العاجلة ، ولا بأس أيضًا في استخدام استطلاع طويل لعدة دقائق ، والتأخير هنا مقبول.
حتى في التطبيقات التي يلزم وجود زمن انتقال منخفض ، إذا كان عدد الرسائل المنقولة منخفضًا جدًا (مثل فشل مراقبة الشبكة) ، فيجب النظر في تكنولوجيا الاقتراع الطويلة.
فقط في السيناريوهات ذات التواصل المنخفض للاستقلاب والرسائل عالية التردد ، يعد اختيار بروتوكول WebSocket مناسبًا جدًا. حتى في هذا سيناريو التطبيق ، هل ما زال من الممكن اختيار اتصال WebSocket؟ أو اختر راحة اتصال HTTP؟
الجواب هو أنه يعتمد على احتياجات التطبيق. ومع ذلك ، من الممكن أيضًا استخدام هاتين التقنيتين في نفس الوقت لوضع البيانات التي يجب تبادلها بشكل متكرر في WebSocket ، واستخدام API REST كتقنية تنفيذ الأعمال القائمة على العملية. بالإضافة إلى ذلك ، عندما تحتاج إلى بث معلومات معينة إلى العديد من العملاء في مكالمة REST API ، يمكن أيضًا تنفيذها من خلال اتصال WebSocket.
يوفر Framework Spring Controller التعليق التوضيحي وشرح RestController ، وكلاهما يمكن استخدامه لمعالجة طلبات HTTP ومعالجة رسائل WebSocket. بالإضافة إلى ذلك ، يمكن لـ Spring MVC طلب معالجة طلبات المعالجة ، أو طرق معالجة طلب التطبيق الأخرى ، استخدام بروتوكول WebSocket بسهولة لبث الرسائل إلى جميع العملاء المهتمين أو المستخدمين المعينين.