เมื่อเร็ว ๆ นี้เมื่อเรียนรู้ WebSocket ฤดูใบไม้ผลิฉันเขียนรหัสตามตัวอย่างในการดำเนินการในฤดูใบไม้ผลิและเบราว์เซอร์รายงานข้อผิดพลาด 404 ที่รันไทม์
การเชื่อมต่อ WebSocket กับ 'ws: // localhost/websocket/marco' ล้มเหลว: ข้อผิดพลาดระหว่างการจับมือกัน WebSocket: รหัสตอบกลับที่ไม่คาดคิด: 404
ทำตามขั้นตอนในการดำเนินการในฤดูใบไม้ผลิ:
ขั้นแรกให้สืบทอด AbstractWebsockethandler และโอเวอร์โหลด 3 วิธีต่อไปนี้:
- handletextMessage จัดการข้อความประเภทข้อความ
- AfterConnectionEstablished เรียกว่าหลังจากการเชื่อมต่อใหม่ถูกจัดตั้งขึ้น
- การเชื่อมต่อหลังการเชื่อมต่อหลังจากปิดการเชื่อมต่อ
นำเข้า org.springframework.web.socket.closestatus; นำเข้า org.springframework.web.socket.textmessage; นำเข้า org.springframework.web.socket.websocketsession; AbstractWebsockethandler {Void HandleTextMessage (เซสชัน WebSocketSession ข้อความข้อความข้อความ) โยนข้อยกเว้น {System.out.println ("ข้อความที่ได้รับ:" + message.get.getPayload ()); Thread.sleep (2000); Session.sendMessage (ข้อความใหม่ ("โปโล!")); } @Override โมฆะสาธารณะ AfterConnectEdEstablished (เซสชัน WebSocketSession) {System.out.println ("การเชื่อมต่อที่สร้างขึ้น!"); } @Override โมฆะสาธารณะ AfterConnectionClosed (เซสชัน WebSocketSession, สถานะใกล้เคียง) {System.out.println ("การเชื่อมต่อปิดสถานะ:" + สถานะ); -ประการที่สองเปิดใช้งาน WebSocket และ Map Message Processors โดยใช้ javaconfig
นำเข้า org.springframework.context.annotation.bean; นำเข้า org.springframework.web.socket.config.annotation.enablewebsocket นำเข้า org.springframework.web.socket.config.annotation.websocketconfigurer; org.springframework.web.socket.config.annotation.websockethandlerregistry; @enablewebsocketpublic คลาส WebSocketConfigurer ใช้ WebSocketConfigurer } @bean สาธารณะ Marcohandler Marcohandler () {ส่งคืน marcohandler ใหม่ (); -ในที่สุดเขียนรหัส JS front-end เพื่อเริ่มคำขอการเชื่อมต่อและการโต้ตอบข้อความที่ตามมา
var url = 'ws: //' + window.location.host + '/websocket/marco'; var sock = ใหม่ websocket (url); sock.onopen = function () {console.log ('เปิด'); Sock.Send ('Marco!');}; sock.onMessage = ฟังก์ชั่น (e) {console.log ('ข้อความที่ได้รับ:', e.data); settimeout (function () {saymarco ()}, 2000);}; sock.onclose = function () {console.log ('ปิด');}; ฟังก์ชั่น saymarco () {console.log ('ส่ง marco!'); Sock.Send ('Marco!');}หลังจากการปรับใช้ให้เปิดเบราว์เซอร์แล้วเรียกใช้และรายงานข้อผิดพลาด 404 โดยตรง
การค้นหาอินเทอร์เน็ตสำหรับการแก้ปัญหากลางคืนรวมถึงประสบการณ์ใน stackoverflow.com ไม่ได้แก้ปัญหาจนกว่าฉันจะดูบทความต่อไปนี้:
วิธีแก้ไขปัญหาการเข้าถึงหน้าเว็บสปริงแบบรวม 404 ปัญหา
มาทำบันทึกที่นี่เพื่อหลีกเลี่ยงการลืมในภายหลัง
WebSocket ยืมคำขอ http สำหรับการจับมือกันเป็นหลัก ในการเปิดใช้งาน Spring WebSocket คุณจะต้องกำหนดค่าการสกัดกั้นคำขอนี้ใน org.springframework.web.servlet.dispatcherservlet
นี่คือวิธีแก้ปัญหา:
ขั้นแรกให้แก้ไขคำจำกัดความของคลาส WebSocketConfig และเพิ่มคำอธิบายประกอบ @Configuration ลงในคลาสซึ่งระบุว่าคลาสนั้นใช้เป็นแหล่งที่มาของคำจำกัดความถั่วในรูปแบบของ Javaconfig (เทียบเท่ากับองค์ประกอบ <Beans> ในการกำหนดค่า XML)
นำเข้า org.springframework.context.annotation.bean; นำเข้า org.springframework.context.annotation.configuration; นำเข้า org.springframework.web.socket.config.annotation.enablewebsocket; org.springframework.web.socket.config.annotation.websockethandlerregistry;@การกำหนดค่า@enablewebsocketpublic คลาส websocketconfig ใช้ websocketconfigurer } @bean สาธารณะ Marcohandler Marcohandler () {ส่งคืน marcohandler ใหม่ (); - ประการที่สองใช้ javaconfig เพื่อกำหนดค่า dispatcherservlet, สืบทอด org.springframework.web.servlet.support.abstractannotationconfigdispatcherservletinitializer และ overload 3 วิธีต่อไปนี้:
- getrootconfigclasses ส่งคืนคลาสด้วย @configuration Annotation เพื่อกำหนดค่าถั่วในบริบทแอปพลิเคชันที่สร้างโดย contextloaderListener
- getServletConfigClasses ส่งคืนคลาสด้วย @Configuration Annotation เพื่อกำหนดถั่วในบริบทแอปพลิเคชัน DispatchERServlet
- GetServletMappings แผนที่หนึ่งเส้นทางขึ้นไปเพื่อ Dispatcherservlet
ในความเป็นจริงหากคุณต้องการเพียงสปริง WebSocket เพื่อให้มีผลคุณจะต้องส่งคืนถั่วในวิธี GetServletConfigClasses ที่กำหนดบริบทแอปพลิเคชัน DispatchERServlet
นำเข้า org.springframework.web.servlet.support.abstractannotationconfigdispatcherservletInitializer; WebSocketInitializer ขยายระดับสาธารณะ } @Override คลาสที่ได้รับการป้องกัน <?> [] getServletConfigClasses () {ส่งคืนคลาสใหม่ <?> [] {webSocketConfig.class}; } @Override String ที่ได้รับการป้องกัน [] GetSerVletMappings () {ส่งคืนสตริงใหม่ [] {"/"}; -นำผู้สืบทอดมาใช้ใหม่และเปิดเบราว์เซอร์ให้สำเร็จ
ข้อความลูกค้า
ข้อความเซิร์ฟเวอร์
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น