هناك ثلاث خطوات رئيسية في هذه المقالة
1. بعد تسجيل الدخول إلى المستخدم ، قم بإنشاء اتصال WebSocket. يتم تحديد التحديد الافتراضي. إذا كان المتصفح لا يدعمه ، فاستخدم SockJs لمحاكاة الاتصال.
2. بعد إنشاء اتصال ، يقوم الخادم بإرجاع الرسالة غير المقروءة للمستخدم.
3. بعد أن يقوم الخادم بإجراء العمليات ذات الصلة ، ادفع رسائل جديدة إلى مستخدم معين أو جميع المستخدمين. Spring 4.0.6 (SELECT 4.0+) ، TOMCAT7.0.55
تطبيق خادم WebSocet
WebSocketConfig.java
@configuration@enableWebmvc@enableWeblobbublic Class WebSocketConfig يمتد WebMVCConfigurerAdapter تنفذ webSocketConfigurer {Overridepublic void registerWebsOckEthandlers (WebSockEthandlerRegistry) websockethandshakeInterceptor ()) ؛ registry.addhandler (SystemWebSockethandler () ، "/sockjs/websocketserver").لا تنس تكوين المسح التلقائي لهذه الفئة في ملف تكوين SpringMVC
<السياق: مكون المسح الضوئي package = "com.ldl.origami.websocket" />
@إعدادات
enableWebmvc
enableWebSocket
يعني هذه الثلاثة تقريبًا أن هذه الفئة تدعم تحميل الفاصوليا في وضع bean ، ويدعم springMVC و WebSocket. انها ليست دقيقة جدا. لقد حاولت enablewebmvc دون إضافته ، و @التكوين يدعم في الأصل المسح التلقائي لـ springmvc
registry.addhandler (SystemWebsockethandler () ، "/WebSocketServer"). AddNistropectors (WebSockethandShakeInterceptor ())
تستخدم لتسجيل فئة تنفيذ خادم WebSocket. المعلمة الثانية هي الوصول إلى عنوان WebSocket.
registry.addhandler (SystemWebsockethandler () ، "/sockjs/websocketserver").AddInterceptors(new WebsockethandShakeInterceptor ()). withsockjs () ؛}
هذه هي طريقة التسجيل باستخدام SockJs
First SystemWebsockethandler.java
SystemWebsoCkethandler من الطبقة العامة تنفذ websockethandler {private static static logger logger ؛ private static final arraylist <BebsOcketSession> static {users = New ArrayList <> () refconnectionStableished (جلسة WebSocketSession) يلقي الاستثناء {logger.debug ("الاتصال بنجاح websocket ...") ؛ user.add (جلسة) ؛ session.getattributes (). get (constants.websocket_username)) ؛ session.sendmessage (textMessage جديد (العد + ") جلسة ، استثناء قابل للارتقاء) يلقي الاستثناء {if (session.isopen ()) {session.close () ؛} logger.debug ("WebSocket Connection مغلق ......") ؛ المستخدمين. مغلق ... ") ؛ users.remove (جلسة) ؛} @ @OverRidepublic Boolean SupportSpartialMessages () {return false ؛ catch (ioException e) {E.PrintStackTrace () ؛}}}/*** أرسل رسالة إلى مستخدم ** param username*param message*/public void sendmessageTouser (string username ، textMessage message) (user.getAttributes (). get (constants.websocket_username) .equals (اسم المستخدم)) {try {if (user.isopen ()) {user.sendmessage (message) ؛يمكنك فهم المحتوى ذي الصلة بنظرة ، لذلك لن أشرح ذلك كثيرًا
ثم websockethandshakeInterceptor.java
الفئة العامة websockethandshakeInterceptor تنفذ المصافحة {private static logger logger = loggerfactory.getLogger (HandshakeInterceptor.class) ؛@overridepublic boolean propershake (serverhtprequest request ، serverhtprespons servletserverhttprequest) {servletserverhttprequest servletrequest = (servletserverhttprequest) طلب ؛ جلسة httpsession = servletrequest.getServletRequest (سلسلة) session.getAttribute (constants.session_username) ؛ entributes.put (constants.websocket_username ، username) ؛}} إرجاع true ؛}@overridepublic void exthandshake (serverhttprequest request ، serverhtpresponse response ، websockethandler wshandler ، استثناء استثناء) {}}تتمثل الوظيفة الرئيسية لهذا في الحصول على اسم المستخدم في الطلب الحالي وحفظه في WebSockethandler الحالي لتحديد المستخدم المقابل إلى WebSockethandler. لمزيد من التفاصيل ، يرجى الرجوع إلى httpsessionhandshakeinterceptor
تسجيل دخول المستخدم لإنشاء اتصال WebSocket
index.jsp
<script type = "text/javaScript" src = "http: // localhost: 8080/origami/websocket/sockjs-0.3.min.js"> </script> <script> var websocket ؛ if in in window) {websocket = new websocket ("ws: // lociethost: 8080/inglici accoki ؛ ('mozwebsocket' في النافذة) {websocket = new mozwebsocket ("ws: // localhost: 8080/erigami/websocketserver") ؛} آخر {websocket = new sockjs ("http: // localhost: 8080/اوريغامي/sockjs/websocketserver") {} ؛ websocket.onmessage = function (evnt) {$ ("#msgCount").كن حذرًا عند استخدام SockJs
1. كيف تكتب هذين
<script type = "text/javaScript" src = "http: // localhost: 8080/erigami/websocket/sockjs-0.3.min.js"> </script> websocket = new SockJS (http: // localhost: 8080/erigami/sockjs/websocketerver) ؛
2. في web.xml
<إصدار تطبيق الويب = "3.0" xmlns = "http://java.sun.com/xml/ns/javaee" http://java.sun.com/xml/ns/javaee/web-app_3_1.xsd ">
إصدار
web-app_3_1.xsd
يجب أن يكون كلا الإصدارين 3.0+
ثم أضفه في هذا servlet
<Sunc-supported> true </async-supported> <vervlet> <Servlet-Name> AppServlet </servlet-name> <Servlet-class> org.springframework.web.servlet.dispatcherservlet </isherlet-class> <Ing-param> <barm-name > contextConfigLocation </param-name> <Param-value> classpath*: servlet-context.xml </parm-value> </ith-param> <load-on-startup> 1 </load-on-startup> <ares-shync-suported> true </async-supported> </servlet>
ثم تتم إضافة جميع المرشحات
<Sunc-sucueded> true </async-sucueded>
3. إضافة التبعيات ذات الصلة
<Rependency> <roupeD> com.fasterxml.jackson.core </rougiD> <ArtifactId> Jackson-Annotations </attifactid> <الإصدار> 2.3.0 </version> </sependency> <redency> <roupencid> com.fasterxml.jackson.core </groupid> <artifa CTID> jackson-core </artifactid> <الإصدار> 2.3.1 </version> </sependency> <reperency> <roupiD> com.fasterxml.jackson.core </groupId> <StifactId> Jackson-Databind </stifactid> <splement> 2.3.3 </version> </dependency>
حسنًا ، يمكن الآن إنشاء WebSocket بشكل طبيعي
إرجاع الرسالة غير المقروءة للمستخدم
بعد إنشاء الاتصال ، سيتم إدخال طريقة ما بعد ConnectionStable لـ SystemWebsockethandler. انظر إلى الكود أعلاه وأخرج اسم المستخدم المحفوظ في WebSockethandShakeInterceptor
بعد الاستعلام عن المعلومات ، استخدم Session.SendMessage (TextMessage جديد (Count + "")) ؛ لإعادته إلى المستخدم ، والعودة والذهاب.
ادفع الرسائل إلى المستخدمين على الخادم
controllerpublic class AdminconTroller {static logger logger = loggerfactory.getLogger (admincontroller.class) ؛@autowired (مطلوب = false) private abeliservice AUDITING (طلب httpservletrequest) {// int unreadnewscount = amersInservice.getUnreadNews (اسم المستخدم) ؛ SystemWebSockethandler (). sendMessageTouser (اسم المستخدم ، textMessage (unreadnewscount + ")يمكنك هنا استخدام SendMessageTouser لدفع المعلومات إلى مستخدم ، أو يمكنك استخدام SendMessageTousers لدفع المعلومات إلى جميع المستخدمين.