Recientemente, al aprender Spring WebSocket, escribí el código de acuerdo con los ejemplos en Spring in Action, y el navegador informó un error 404 en tiempo de ejecución.
Conexión de WebSocket a 'ws: // localhost/webSocket/marco' falló: error durante el apretón de manos de websocket: código de respuesta inesperado: 404
Siga los pasos en la primavera en acción:
Primero, herede el abstractwebsockethandler y sobrecarga los siguientes 3 métodos:
- HandleLetExtMessage maneja mensajes de tipo de texto
- AfterConnectionSestised llamado después de establecer una nueva conexión
- Llamada cerrada después de la conexión después de que se cierre la conexión
importar org.springframework.web.socket.cloSestatus; import org.springframework.web.socket.textmessage; import org.springframework.web.socket.websocketSession; import og.springframeRwork.web.socket.handler.abstractwoBsockethandler; publicidad de clase pública extiende extiende extiende extensiones Void HandletExtMessage (Sesión de WebSocketSession, TextMessage Mensaje) lanza la excepción {System.out.println ("Mensaje recibido:" + Message.getPayLoad ()); Thread.sleep (2000); session.sendMessage (nuevo TextMessage ("Polo!")); } @Override public void AfterConnectionSeStablised (Session WebSocketSession) {System.out.println ("Conexión establecida!"); } @Override public void AfterConnectionClosed (Sesión de WebSocketSession, STATO DE CLOCERSTATUS) {System.out.println ("Conexión cerrada. Estado:" + estado); }}En segundo lugar, habilite los procesadores de mensajes de WebSocket y mapee utilizando Javaconfig
importar org.springframework.context.annotation.bean; import org.springframework.web.socket.config.annotation.enablewebsocket; import org.springframework.web.socket.config.annotation.websocketconfigurer; importar; import org.springframework.web.socket.config.annotation.websockethandlerRegistry; @enablewebsocketpublic class webocketCigurer implementa WebSocketCigurer {@Override public void registerwebsockethandlers (WebSockethandlerRegistry Registry) {Registry.addhandler (Marcohandler (), "/"/""); } @Bean public Marcohandler Marcohandler () {return new MarcoHandler (); }}Finalmente, escriba el código JS front-end para iniciar solicitudes de conexión e interacciones de mensajes posteriores
var url = 'ws: //' + window.location.host + '/websocket/marco'; var sock = new WebSocket (url); sock.onopen = function () {console.log ('apertura'); SOCK.SEND ('Marco!');}; sock.onmessage = function (e) {console.log ('mensaje recibido:', e.data); setTimeOut (function () {saymarco ()}, 2000);}; sock.OnClose = function () {console.log ('cierre');}; function saymarco () {console.log ('enviando marco!'); sock.send ('Marco!');}Después de la implementación, abra el navegador y ejecútelo, e informe directamente un error 404
Buscar en Internet una solución nocturna, incluida la experiencia en stackoverflow.com, no resolvió el problema hasta que vi el siguiente artículo:
SOLUCIÓN A SPRINGE Integrated WebSocket Page Access 404 Problema
Hagamos un registro aquí para evitar olvidar más tarde.
WebSocket esencialmente presta solicitudes HTTP para apretón de manos. Para habilitar Spring WebSocket, debe configurar la intercepción de esta solicitud en org.springframework.web.servlet.dispatcherservlet.
Aquí están las soluciones:
Primero, modifique la definición de clase WebSocketConfig y agregue la anotación @Configuration a la clase, lo que indica que la clase se usa como fuente de definición de frijoles en forma de Javaconfig (equivalente al elemento <Beans> en la configuración XML).
importar org.springframework.context.annotation.bean; import org.springframework.context.annotation.configuration; import org.springframework.web.socket.config.annotation.enablewebsocket; import org.springframework.web.socket.config.annotation.websockethandlerRegistry;@configuration@habilitados en la clase WebSocketConfig implementa WebSocketCigurer {@Override public void registerwebsockethandlers (Registro WebSocketHandLerRegistry) {registro.addhandler (marcohandler (), "/"/"/" ");"); ");"); ");"); ");"); ");"); ");" } @Bean public Marcohandler Marcohandler () {return new MarcoHandler (); }} En segundo lugar, use Javaconfig para configurar el despachador, heredar org.springframework.web.servlet.support.abstractannotationconfigdispatcherservletinitializer, y sobrecarga los siguientes 3 métodos:
- GetRootConfigClasses Devuelve la clase con la anotación de @Configuration para configurar los frijoles en el contexto de la aplicación creado por contextloaderListener
- GetServletConfigClasses Devuelve la clase con la anotación de @Configuration para definir el bean en el contexto de la aplicación despachadorServlet
- GetServletMappings Maps una o más rutas para despacharservlet
De hecho, si solo necesita Spring WebSocket para entrar en vigencia, solo necesita devolver el Bean en el método GetServletConfigClasses que define el contexto de la aplicación DispatcherServlet.
importar org.springframework.web.servlet.support.abstractannotationConfigDispatcherservletInitializer; public Class WebSocketInitializer extiende AbstractAnnotationConfigDispatcherservletinitializer {@Override Class <?> [] } @Override Class protegido <?> [] GetServletConfigClasses () {return new class <?> [] {WebSocketConfig.class}; } @Override String protegido [] getServletMappings () {return new String [] {"/"}; }}Redextar al descendiente y abrir el navegador con éxito
Mensaje del cliente
Mensaje de servidor
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.