บทความนี้มีสามขั้นตอนหลัก
1. หลังจากผู้ใช้เข้าสู่ระบบแล้วให้สร้างการเชื่อมต่อ WebSocket เลือกการเลือกเริ่มต้น หากเบราว์เซอร์ไม่รองรับให้ใช้ sockjs เพื่อจำลองการเชื่อมต่อ
2 หลังจากสร้างการเชื่อมต่อเซิร์ฟเวอร์จะส่งคืนข้อความที่ยังไม่ได้อ่านของผู้ใช้
3. หลังจากเซิร์ฟเวอร์ดำเนินการที่เกี่ยวข้องให้ส่งข้อความใหม่ไปยังผู้ใช้บางรายหรือผู้ใช้ทั้งหมด ฤดูใบไม้ผลิ 4.0.6 (เลือก 4.0+), tomcat7.0.55
การใช้งาน WebSocet Server
websocketconfig.java
@การกำหนดค่า@enablewebmvc@enablewebsocketpublic คลาส websocketconfig ขยาย webmvcconfigureradapter ใช้ websocketconfigurer {@overridepublic void registerwebsockethandlers (WebSocketHandlerRegistry Registry) websockethandshakeInterceptor ()); registry.addhandler (systemwebsockethandler (), "/sockjs/websocketserver").addinterceptors( ใหม่ websockethandshakeInterceptor ()@)}}@beanpublic websockethandler systemsอย่าลืมกำหนดค่าการสแกนอัตโนมัติของคลาสนี้ในไฟล์กำหนดค่าของ SpringMVC
<บริบท: Component-scan base-package = "com.ldl.origami.websocket" />
@การกำหนดค่า
@enablewebmvc
@enableWebSocket
ทั้งสามนี้หมายความว่าคลาสนี้รองรับการโหลดถั่วในโหมด @Bean และรองรับ SpringMVC และ WebSocket มันไม่ถูกต้องมาก ฉันลอง @enablewebmvc โดยไม่ต้องเพิ่มและ @configuration เดิมรองรับการสแกนอัตโนมัติของ SpringMVC
registry.addhandler (SystemWebSockethandler (), "/WebSocketServer"). AddInterceptors (WebSocketHandshakeInterceptor () ใหม่))
ใช้เพื่อลงทะเบียนคลาสการใช้งาน Server Server พารามิเตอร์ที่สองคือการเข้าถึงที่อยู่ WebSocket
registry.addhandler (SystemWebSockethandler (), "/sockjs/websocketServer").addinterceptors( ใหม่ websockethandshakeinterceptor ()). withsockjs ();};
นี่คือวิธีการลงทะเบียนโดยใช้ sockjs
SystemWebsockethandler.java แรก
SystemWebSockethandler ใช้ WebSocketHandler {Logger Logger สุดท้ายคงที่ส่วนตัว; arrayList สุดท้ายคงที่ <SocketSession> ผู้ใช้; แบบคงที่ {users = new ArrayList <> (); logger = loggerFactory.getLogger AfterConnectionEstablished (เซสชัน WebSocketSession) โยนข้อยกเว้น {logger.debug ("เชื่อมต่อกับความสำเร็จของ WebSocket ... "); users.add (เซสชัน); String username = (string) session.getAttributes () รับ (query.websocket_username); session.getattributes (). รับ (ค่าคงที่ websocket_username)); session.sendmessage (ข้อความใหม่ (นับ + ""));}}@overridepublic โมฆะ handlemessage HandletRansporterror (เซสชัน WebSocketSession, ข้อยกเว้นแบบโยนได้) โยนข้อยกเว้น {ถ้า (session.isopen ()) {session.close ();} logger.debug ("การเชื่อมต่อเว็บไซต์ปิด ...... "); users.remove (เซสชัน);}@overridepublic {logger.debug ("การเชื่อมต่อ websocket ปิด ... "); users.remove (เซสชัน);} @overridepublic boolean supportspartialMessages () {return false;}/*** ส่งข้อความไปยังผู้ใช้ออนไลน์ทั้งหมด {user.sendMessage (ข้อความ);}} catch (ioexception e) {e.printstacktrace ();}}}/*** ส่งข้อความถึงผู้ใช้ ** @param ชื่อผู้ใช้*@param Message*/public Void SendMessagetouser (user.getAttributes (). รับ (ค่าคงที่ websocket_username) .equals (ชื่อผู้ใช้)) {ลอง {ถ้า (user.isopen ()) {user.sendMessage (ข้อความ);}} catch (ioexception e) {e.printstacktrace ();}}}}}}}}}}คุณสามารถเข้าใจเนื้อหาที่เกี่ยวข้องได้อย่างรวดเร็วดังนั้นฉันจะไม่อธิบายมากนัก
จากนั้น websockethandshakeinterceptor.java
คลาสสาธารณะ WebSocketHandshakeInterceptor ใช้ HandshakeInterceptor {Logger Logger แบบคงที่ส่วนตัว = loggerFactory.getLogger (handshakeInterceptor.class);@overridepublic บูลีนก่อนหน้านี้ servletserverhttprequest) {servletserverhttprequest servletrequest = (servletserverhttprequest) คำขอ; httpsession session = servletrequest.getServletRequest (). getSession session.getAttribute (ค่าคงที่ Session_username); attributes.put (constants.websocket_username, ชื่อผู้ใช้);}} return true;}@overridepublic เป็นโมฆะ Afterhandshake (คำขอ serverhttprequest, serverhttpresponse, การตอบสนอง, 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 ('webSocket' ในหน้าต่าง) ('mozwebsocket' ในหน้าต่าง) {websocket = ใหม่ mozwebsocket ("ws: // localhost: 8080/origami/websocketserver");} else {websocket = sockjs ใหม่ ("http: // localhost: 8080/arigami/sockjs/websockets {}; webSocket.onMessage = function (evnt) {$ ("#msgcount"). html ("(<font color = 'red'>"+evnt.data+"</font>)")}}}; websocket.onerror = function (evnt)ระวังเมื่อใช้ sockjs
1. วิธีการเขียนสองนี้
<script type = "text/javascript" src = "http: // localhost: 8080/origami/websocket/sockjs-0.3.min.js"> </script> websocket = sockjs ใหม่ (http: // localhost: 8080/origami/sockjs/websockets);
2. ใน web.xml
<web-app version = "3.0" xmlns = "http://java.sun.com/xml/ns/javaee" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance http://java.sun.com/xml/ns/javaee/web-app_3_1.xsd ">
รุ่น
web-app_3_1.xsd
ทั้งสองเวอร์ชันต้องเป็น 3.0+
จากนั้นเพิ่มใน servlet นี้
<sync-upported> True </async-supported> <servlet> <servlet-name> appservlet </servlet-name> <servlet-lass> org.springframework.web.servlet.dispatcherservlet </servlet-class> > contextConfigLocation </param-name> <param-value> classpath*: servlet-context.xml </param-value> </init-param> <load-on-startup> 1 </load-on-startup> <sync-supported>
จากนั้นจะเพิ่มตัวกรองทั้งหมด
<sync-upported> true </async-upported>
3. เพิ่มการพึ่งพาที่เกี่ยวข้อง
<erperency> <sderctId> com.fasterxml.jackson.core </groupId> <ratifactid> แจ็คสัน-แอนโนติก </artifactid> <cersion> 2.3.0 </เวอร์ชัน> </การพึ่งพา> <การพึ่งพา CTID> Jackson-Core </artifactid> <sersion> 2.3.1 </เวอร์ชัน> </การพึ่งพา> <การพึ่งพา> <roupId> com.fasterxml.jackson.core </groupid>
ตกลงตอนนี้สามารถสร้าง WebSocket ได้ตามปกติ
ส่งคืนข้อความที่ยังไม่ได้อ่านของผู้ใช้
หลังจากสร้างการเชื่อมต่อแล้วจะมีการป้อนวิธีการที่ได้รับการเชื่อมต่อของ SystemWebSocketHandler ดูรหัสด้านบนและนำชื่อผู้ใช้ที่บันทึกไว้ใน WebSocketHandshakeInterceptor
หลังจากสอบถามข้อมูลให้ใช้ session.sendMessage (TextMessage ใหม่ (นับ + "")); เพื่อส่งคืนให้ผู้ใช้และกลับไปและไป
ส่งข้อความถึงผู้ใช้บนเซิร์ฟเวอร์
@ControllerPublic คลาส adminController {logger logger แบบคงที่ = loggerFactory.getLogger (adminController.class);@autowired (จำเป็น = เท็จ) ผู้ดูแลระบบส่วนตัว SystemWebSocketHandler ();}@requestmapping ("/การตรวจสอบ")@responsebodypublic string การตรวจสอบ (คำขอ httpservletrequest) {// int unreadNewscount = adminService.getUnreadNews (ชื่อผู้ใช้); SystemWebSocketHandler () ผลลัพธ์;}}ที่นี่คุณสามารถใช้ SendMessagetouser เพื่อส่งข้อมูลไปยังผู้ใช้หรือคุณสามารถใช้ SendMessagetousers เพื่อส่งข้อมูลไปยังผู้ใช้ทุกคน