مثال الدفع في الوقت الفعلي WebSocket مكتوب استنادًا إلى إطار الربيع ، والمحتوى المحدد هو كما يلي
الخطوة 1: بناء مشروع SpringMVC بنفسك ، إنه بسيط للغاية ، متاح على Baidu Online ؛ أضف ملف POM التالي:
<!-WebSocket-> <reperency> <roupiD> org.springframework </rougeid> <StifactId> Spring-Websocket </stifactid> <splection> 4.2.4 <splect> 4.2.4.Release </version> </sependency>
إصدار الربيع الخاص بي هو 4.2.4 ، لذا فإن WebSocket هو أيضًا 4.2.4 ؛ من الأفضل الحفاظ على نفس إصدار الربيع
الخطوة 2: اكتب معالج الرسائل
/** * اسم المشروع: SpringRabbitMq * اسم الملف: MyMessageHandler.java * اسم الحزمة: com.zsy.websocket * التاريخ: 31 يناير 2018 في 11:10:03 صباحًا * حقوق الطبع والنشر (C) 2018 ، Zhaoshouyun جميع الحقوق محفوظة. * */ package com.zsy.websocket ؛ استيراد java.io.ioException ؛ استيراد java.util.map ؛ استيراد java.util.set ؛ استيراد java.util.concurrent.concurrenthashmap ؛ استيراد org.apache.commons.lang3.StringUtils ؛ استيراد org.springframework.web.socket.closestatus ؛ استيراد org.springframework.web.socket.textMessage ؛ استيراد org.springframework.web.socket.websockethandler ؛ استيراد org.springframework.web.socket.websocketMessage ؛ استيراد org.springframework.web.socket.websocketsession ؛ /** * ClassName: MyMessageHandler * الوظيفة: تنفيذ واجهة WebScoket * التاريخ: 31 يناير ، 2018 في 11:10:03 AM * Author Zhaoshouyun * @Version * Since JDK 1.7 */Class MyMessageHandler Public Prements WebSockethandler {// user key static string user_key = "current_user" ؛ / *** USERMAP: تخزين معلومات WebSCOKET لاتصال المستخدم* since JDK 1.7*/ خريطة ثابتة نهائية خاصة <String ، WebSocketsession> USERMAP ؛ static {usermap = concurrenthashMap الجديد <string ، websocketsession> (30) ؛ } / *** يتم استدعاء هذه الطريقة عند إغلاق websocket* see org.springframework.web.socket.websockethandler#بعد connectclosed (org.springframework.web.socket.websocketsession ، org.springframewwork.web.socket. جلسة ، حالة Closestatus) يلقي استثناء {string userId = this.getuserId (الجلسة) ؛ if (stringUtils.isnoneBlank (userId)) {usermap.remove (userId) ؛ System.err.println ("هذا" + userId + "تم إغلاق المستخدم بنجاح") ؛ } آخر {system.err.println ("عند الإغلاق ، احصل على معرف المستخدم فارغ") ؛ }} / *** يتم استدعاء هذه الطريقة عند إنشاء اتصال WebSocket* see org.springframework.web.socket.websockethandler#eftConnectableStableishipishipishipishipished (org.springframewew this.getuserid (الجلسة) ؛ if (stringUtils.isnoneBlank (userId)) {usermap.put (userId ، session) ؛ Session.SendMessage (TextMessage جديد ("تم إنشاء اتصال WebSocket بنجاح!")) ؛ } ستر HandleMessage (جلسة WebSocketSession ، WebSocketMessage <؟> رسالة) يلقي الاستثناء {String msg = message.toString () ؛ string userId = this.getuserId (الجلسة) ؛ System.Err.println (""+userid+"رسالة المرسلة من قبل المستخدم هي:"+msg) ؛ message = new TextMessage ("استلم الخادم الرسالة ، msg ="+msg) ؛ Session.SendMessage (Message) ؛ } / *** عند حدوث استثناء في عملية الإرسال ، اتصل بهذه الطريقة* see org.springframework.web.socket.websockethandler#handletransporterRor (org.springframework.web.socket.webssocketsession ، java.lang.throwable) E) رمي الاستثناء {websocketMessage <string> message = new textMessage ("رسالة استثناء:"+E.GetMessage ()) ؛ Session.SendMessage (Message) ؛ } / ** * * see org.springframework.web.socket.websockethandler#supportSpartialMessages () * / Override boolean supportspartialMessages () {return false ؛ } / ** * sendMessageTouser: أرسل إلى المستخدم المحدد * Author ZhaoshouyUn * param userid * param contents * since jdk 1.7 * / public void sendMessageTouser (String userId ، contents string) {websocketsession session = usermap.get (userid) ؛ if (session! = null && session.isopen ()) {try {textMessage message = new textMessage (contents) ؛ Session.SendMessage (Message) ؛ } catch (ioException e) {E.PrintStackTrace () ؛ }}} / ** * SendMessageToAllusers: أرسل إلى جميع المستخدمين * Author Zhaoshouyun * param contents * since JDK 1.7 * / public void sendMessageToAllusers (contents string) {set userids = usermap.keyset () ؛ لـ (String userId: userIds) {this.sendMessageTouser (userId ، محتويات) ؛ }} / ** * getUserId: احصل على معرف المستخدم * Author ZhaoShouyun * session * @session * return * since jdk 1.7 * / private string getUserId (جلسة websocketsession) {try {String userId = (string) session.getattributes (). get (user_key) ؛ إرجاع المستخدم ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } إرجاع فارغ ؛ }}الخطوة 3: اكتب التكوين المتعلق بـ WebSocket ، بالطبع ، يمكنك تكوينه في XML ؛ أنا لا أستخدم تكوين XML الآن ، وأنا أستخدم تكوين الكود ، وأحتاج إلى إضافة حزمة مسح في XML <COUNTEXT: COMPONENT-SCAN BASEAGEAGE = "Com.zsy.websocket" />
/** * اسم المشروع: SpringRabbitMq * اسم الملف: WebSocketConfig.java * اسم الحزمة: com.zsy.websocket * التاريخ: 1:10:33 مساءً في 31 يناير 2018 * حقوق الطبع والنشر (C) 2018 ، Zhaoshouyun جميع الحقوق محفوظة. * * / / ** * اسم المشروع: SpringRabbitMq * اسم الملف: WebSocketConfig.java * اسم الحزمة: com.zsy.websocket * التاريخ: 1:10:33 مساءً في 31 يناير 2018 * حقوق الطبع والنشر (C) 2018 ، Zhaoshouyun جميع الحقوق محفوظة. * */ package com.zsy.websocket ؛ استيراد org.springframework.context.annotation.bean ؛ استيراد org.springframework.context.annotation.configuration ؛ استيراد org.springframework.web.socket.websockethandler ؛ استيراد org.springframework.web.socket.config.annotation.enableWebsocket ؛ استيراد org.springframework.web.socket.config.annotation.websocketConfigurer ؛ استيراد org.springframework.web.socket.config.annotation.websockethandlerRegistry ؛ /** * className: WebSocketConfig * الوظيفة: TODO ADD Function. * التاريخ: 31 يناير ، 2018 في 1:10:33 PM * Author Zhaoshouyun * Version org.springframework.web.socket.config.annotation.websocketConfigurer#registerWebsockethandlers (org.springframework.web.socket.config.annotation.websockethandlerregistry) registry.addhandler (myhandler () ، "/testHandler").AddInterceptors(new WebSocketInterceptor ()) ؛ registry.addhandler (myhandler () ، "/socketjs/testhandler").AddInterceptors(new WebSocketInterceptor ()). withsockjs () ؛ } bean public websockethandler myhandler () {return new MyMessageHandler () ؛ }} الخطوة 4: اكتب محول WebSocket
حزمة com.zsy.websocket ؛ استيراد java.util.map ؛ استيراد org.springframework.http.server.serverhttprequest ؛ استيراد org.springframework.http.server.serverhttpresponse ؛ استيراد org.springframework.http.server.servletserverhttprequest ؛ استيراد org.springframework.web.socket.websockethandler ؛ استيراد org.springframework.web.socket.server.support.httpsessionhandshakeinterceptor ؛ /** * className: WebSocketInterceptor * الوظيفة: TODO إضافة وظيفة. * التاريخ: 31 يناير 2018 في 11:42:34 AM * Author ZhaoShouyun * Version * since JDK 1.7 * / public class WebSocketInctor يمتد httpsessionhandshakeinterceptor { / ** * يصف Todo بإيجاز وظيفة التنفيذ لهذه الطريقة (اختيارية). * see org.springframework.web.socket.server.support.httpsessionhandshakeInterceptor#precthandshake (org.springframework.http.server.serverhttprequest org.springframework.web.socket.websockethandler ، java.util.map) */ Override boolean public ripthake (serverhttprequest request ، serverhttpresponse response ، websockethandler wshandler ، map <string ، compertes) throws {request of serperof serveSer. servletserverhttprequest serverhttprequest = (servletserverhttprequest) طلب ؛ // get parameter string userId = serverHtpRequest .getServletRequest (). getParameter ("userId") ؛ attributes.put (mymessageHandler.user_key ، userId) ؛ } إعادة صواب ؛ }} JS المقابل في الخطوة 5:
أقل "http://www.w3.org/tr/html4/loose.dtd"> <html> <head> <meta http-equiv = "content-type" content = "text/html ؛ charset = iso-8859-1" <title> title type> </tistrict " // أولاً حدد ما إذا كان WebSocket مدعومًا إذا ('websocket' في النافذة) {websocket = websocket جديد ("ws: // localhost: 8085/springtest/testHandler؟ userId = Zhaoshouyun") ؛ } آخر إذا ('mozwebsocket' في النافذة) {websocket = new mozwebsocket ("ws: // localhost: 8085/springtest/testHandler؟ userId = zhaoshouyun") ؛ } آخر {websocket = sockjs جديد ("http: // localhost: 8085/springtest/socketjs/testHandler؟ userId = Zhaoshouyun") ؛ } // عند فتح الاتصال ، websocket.onopen = function (evnt) {console.log ("websocket.onopen") ؛ } ؛ // عند تلقي الرسالة ، websocket.onmessage = function (evnt) {Alert (evnt.data) ؛ } ؛ websocket.onerror = function (evnt) {console.log ("websocket.onerror") ؛ } ؛ websocket.onclose = function (evnt) {console.log ("websocket.onclose") ؛ } ؛ الدالة says () {// العميل يرسل بنشاط رسالة websocket.send (document.getElementById ('msg'). value) ؛ } </script> </head> <body> <input type = "text" value = "" id = "msg"> <button onClick = "say () اختبار الخطوة 6:
حزمة com.zsy.test.controller ؛ استيراد java.util.hashmap ؛ استيراد java.util.map ؛ استيراد org.springframework.beans.factory.annotation.autowired ؛ استيراد org.springframework.beans.factory.annotation.value ؛ استيراد org.springframework.stereotype.controller ؛ استيراد org.springframework.web.bind.annotation.requestbody ؛ استيراد org.springframework.web.bind.annotation.requestmapping ؛ استيراد org.springframework.web.bind.annotation.ResponseBody ؛ استيراد com.zsy.websocket.mymessageHandler ؛ /** * className: TestController * الوظيفة: ToDo Add Function. * التاريخ: 14 ديسمبر ، 2017 في 11:11:23 AM * Author Zhaoshouyun * version * since JDK 1.7 */ controller الفئة العامة testController {Autowired mymessageHandler Handler ؛ @requestmapping ("/get") السلسلة العامة get () {return "index" ؛ } responseBodyRequestMapping ("/get1") SEND SEND (اسم السلسلة) {Handler.SendMessageTouser ("Zhaoshouyun" ، "المحتوى الذي أرسله الخادم:"+اسم) ؛ إرجاع "النجاح" ؛ }}ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.