في الآونة الأخيرة ، عند تعلم SPRING WebSocket ، كتبت الرمز وفقًا للأمثلة في فصل الربيع في العمل ، وأبلغ المتصفح عن خطأ 404 في وقت التشغيل.
فشل اتصال WebSocket بـ "WS: // LocalHost/WebSocket/Marco": خطأ أثناء مصافحة WebSocket: رمز الاستجابة غير المتوقع: 404
اتبع الخطوات في الربيع في العمل:
أولاً ، وراثة ustrultwebsoCkethandler و Overload the Text 3 Methods:
- HandleTextMessage يتولى رسائل نوع النص
- تم استدعاء ما بعد الوصلات بعد إنشاء اتصال جديد
- مكالمة بعد الوصية بعد إغلاق الاتصال
استيراد org.springframework.web.socket.closestatus ؛ استيراد org.springframework.web.socket.textmessage ؛ استيراد org.springframework.web.socket.websocketsession ؛ {حماية void handletextMessage (جلسة WebSocketSession ، رسالة TextMessage) يلقي الاستثناء {system.out.println ("رسالة مستلمة:" + message.getPayload ()) ؛ thread.sleep (2000) ؛ Session.SendMessage (TextMessage جديد ("Polo!")) ؛ } Override public void afterConnectionEstablised (جلسة WebSocketSession) {system.out.println ("connection late!") ؛ } Override public void afterconnectclosed (جلسة WebSocketSession ، حالة Careestatus) {system.out.println ("اتصال مغلق. الحالة:" + الحالة) ؛ }}ثانياً ، تمكين معالجات الرسائل و WebSocket و MAP باستخدام JavaconFig
استيراد org.springframework.context.annotation.bean ؛ استيراد org.springframework.web.socket.config.annotation.enableWebsocket ؛ استيراد org.springframework.web.socket.anting.annotation.websocketconfiger ؛ org.springframework.web.socket.config.annotation.websockethandlerRegistry ؛ enableWebublicPublicpublicpublicpublicpublicpublicpurnfigurer تنفذ WebSocketConfigurer {Override public void registerWebsockEthandlers (WebSockethandlerRegistry Registry) {registry.addhandler () } bean public MarcoHandler MarcoHandler () {return new MarcoHandler () ؛ }}أخيرًا ، اكتب رمز JS في الواجهة الأمامية لبدء طلبات الاتصال وتفاعلات الرسائل اللاحقة
var url = 'ws: //' + window.location.host + '/websocket/marco' ؛ var sock = new websocket (url) ؛ sock.onopen = function () {console.log ('Open') ؛ Sock.send ('Marco!') ؛} ؛ sock.onmessage = function (e) {console.log ('message requalit:' ، e.data) ؛ setTimeOut (function () {saymarco ()} ، 2000) ؛} ؛ sock.onclose = function () {console.log ('closing') ؛} ؛ function saymarco () {console.log ('' sending marco! ') ؛ Sock.Send ('Marco!') ؛}بعد النشر ، افتح المتصفح وقم بتشغيله ، والإبلاغ مباشرة عن خطأ 404
إن البحث في الإنترنت عن حل ليلي ، بما في ذلك التجربة على Stackoverflow.com ، لم يحل المشكلة حتى شاهدت المقالة التالية:
حل لصفحة WebSocket المتكاملة لـ Spring WebSocket CONCE 404 مشكلة
دعونا نجعل رقماً قياسياً هنا لتجنب النسيان لاحقًا.
WebSocket بشكل أساسي يقترض طلبات HTTP للمصافحة. لتمكين WebSocket Spring ، تحتاج إلى تكوين اعتراض هذا الطلب في org.springframework.web.servlet.dispatcherservlet.
فيما يلي الحلول:
أولاً ، قم بتعديل تعريف فئة WebSocketConfig وأضف توضيح التكوين إلى الفصل ، مما يشير إلى أن الفئة تستخدم كمصدر لتعريف الفول في شكل JavaconFig (أي ما يعادل عنصر <Neans> في تكوين 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 ؛@configuration@enableWeblessPublic Class WebSocketConfig تنفذ WebSocketConfigurer {Override public void registerWebsockEthandlers (WebSockethandlerRegistry Registry) {registry. } bean public MarcoHandler MarcoHandler () {return new MarcoHandler () ؛ }} ثانياً ، استخدم javaconfig لتكوين spatcherservlet ، وراثي org.springframework.web.servlet.support.abstractannotationConfigDispatcherservletinitializer ، والتحميل الزائد للطرق الثلاثة التالية:
- GetRootConfigClasses إرجاع الفصل مع التعليق التوضيحي لـ Configuration لتكوين الفاصوليا في سياق التطبيق الذي تم إنشاؤه بواسطة ContextLoaderListener
- GetServletConfigClasses إرجاع الفصل مع التعليق التوضيحي لـ configuration لتحديد الفول في سياق تطبيق Dispatcherservlet
- GetServletMappings خريطة مسار واحد أو أكثر
في الواقع ، إذا كنت بحاجة فقط إلى WebSocket لتصبح مفعولًا ، فأنت بحاجة فقط إلى إعادة الفول في طريقة GetServletConfigClasses التي تحدد سياق تطبيق Servatcherservlet.
استيراد org.springframework.web.servlet.support.abstractAntAntAntationConfigDispatcherservletInitializer. } Override فئة محمية <؟> [] getServletConfigClasses () {إرجاع فئة جديدة <؟> [] {WebSocketConfig.class} ؛ } Override المحمي السلسلة [] getSerVletMappings () {return new string [] {"/"} ؛ }}إعادة نشر النسل وفتح المتصفح بنجاح
رسالة العميل
رسالة الخادم
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.