Kürzlich, als ich Spring Websocket lernte, schrieb ich den Code gemäß den Beispielen im Frühjahr in Aktion, und der Browser meldete zur Laufzeit einen 404 -Fehler.
WebSocket -Verbindung zu 'WS: // localhost/webocket/marco' fehlgeschlagen: Fehler während der Websocket -Handshake: Unerwarteter Antwortcode: 404
Befolgen Sie die Schritte im Frühjahr in Aktion:
Erben Sie zunächst die AbstractWebsockethandler und überlasten Sie die folgenden 3 Methoden:
- HandletEXTMessage behandelt Texttypnachrichten
- AfterConnectionEtableded nach einer neuen Verbindung hergestellt
- AfterConnection Clyded Call nach der Schließung der Verbindung
import org.springframework.web.socket.closestatus; import org.springframework AbstractWebSocketHandler {Protected void HandlextMessage (WebSocketSession -Sitzung, TextMessage -Nachricht) löst Ausnahme aus {System.out.println ("Empfangene Nachricht:" + message.getPayload ()); Thread.Sleep (2000); Session.SendMessage (neue Textmessage ("Polo!")); } @Override public void AfterConnectionESTABLEDS (WebSocketSession Session) {System.out.println ("Verbindung hergestellt!"); } @Override public void AfterConnectionCLOSED (WebSocketSession -Sitzung, Closestatus -Status) {System.out.println ("Verbindung geschlossen. Status:" + Status); }}Zweitens aktivieren Sie WebSocket- und Map -Nachrichtenprozessoren mit Javaconfig
import org.springframework.context.annotation.bean; import org.springframework.web.socket.config.annotation org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;@EnableWebSocketpublic class WebSocketConfigurer implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(marcoHandler(), "/marco"); } @Bean public marcohandler marcohandler () {return New Marcohandler (); }}Schreiben Sie schließlich Front-End-JS-Code, um Verbindungsanforderungen und nachfolgende Nachrichteninteraktionen zu initiieren
var url = 'ws: //' + window.location.host + '/webocket/marco'; var socK = new WebSocket (URL); sock.onopen = function () {console.log ('Eröffnung'); Sock.Send ('marco!');}; Sock.onMessage = Funktion (e) {console.log ('empfangene Nachricht:', E.Data); setTimeout (function () {sayMarco ()}, 2000);}; sock.onclose = function () {console.log ('closing'); SOCK.Send ('Marco!');}Öffnen Sie nach dem Einsatz den Browser und führen Sie ihn aus und melden Sie ihn direkt über einen 404 -Fehler
Durch die Suche im Internet nach einer Nachtlösung, einschließlich der Erfahrung auf Stackoverflow.com, hat das Problem erst gelöst, bis ich den folgenden Artikel angesehen habe:
Lösung für Spring Integrated WebSocket -Seite Zugriff 404 Problem
Lassen Sie uns hier eine Aufzeichnung machen, um zu vermeiden, dass es später vergessen wird.
WebSocket lasiert im Wesentlichen HTTP -Anforderungen für Handshake. Um Spring WebSocket zu aktivieren, müssen Sie das Abfangen dieser Anfrage in org.springframework.web.servlet.DispatcherServlet konfigurieren.
Hier sind die Lösungen:
Ändern Sie zunächst die WebSocketCon -Class -Definition und fügen Sie die Annotation @Configuration zur Klasse hinzu, um anzuzeigen, dass die Klasse als Quelle der Bean -Definition in Form von Javaconfig verwendet wird (äquivalent zum <Beans> -Element in der XML -Konfiguration).
import org.springframework.context.annotation.bean; import org.springframework.context.annotation.configuration; import org.springframework.web.socket.config.annotation org.springframework.web.socket.config.annotation.websocketconFigurer; RegisterWebSocketHandherlers (WebSockeThandlerregistry Registry) {Registry.AddHandler (marcohandler (), "/marco"); } @Bean public marcohandler marcohandler () {return New Marcohandler (); }} Zweitens verwenden Sie Javaconfig, um den DispatcherServlet zu konfigurieren, org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletinitializer und überlasten die folgenden 3 Methoden:
- GetRootConfigclasses gibt die Klasse mit @Configuration Annotation zurück, um Beans im von contextloaderListen erstellten Anwendungskontext zu konfigurieren
- GetServletConfigclasses gibt die Klasse mit @Configuration -Annotation zurück, um die Bean im Kontext des DispatcherServlet -Anwendung zu definieren
- GetServletMappings -Karta einen oder mehrere Pfade in Dispatcherservlet
Wenn Sie nur Spring WebSocket in Kraft setzen müssen, müssen Sie die Bean nur in der Methode GetServletConFigclasss zurückgeben, mit der der Kontext der DispatcherServlet -Anwendung definiert wird.
import org.springframework.web.servlet.support.abstractAnnotationConfigDispatcherServletInitializer; Public Class WebSocketinitializer erweitert die AbstractAnnotationConFigDispatcheritializer {@override geschützte Klasse <> [] Getrootconfigclasses () {@Override geschützte Klasse <] getrootconfigclasses () {{{{{{{Return Null; } @Override Protected Class <?> [] GetServletConfigClasses () {neue Klasse <?> [] {WebSocketConfig.class}; } @Override Protected String [] getServletMappings () {return New String [] {"/"}; }}Den Nachkomme neu anwenden und den Browser erfolgreich öffnen
Client -Nachricht
Servernachricht
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.