¿Cuáles son los ejemplos de combinación de websocket y springmvc?
Recientemente, por necesidad, he estado haciendo un juego web. La página debe actualizarse en tiempo real en un período de tiempo determinado. En la actualidad, la idea común para crear sitios web es el método de sondeo js. Dado que se trata de un pequeño proyecto innovador, un amigo del mismo grupo propuso WebSocket mencionado en html5 y realizó una investigación técnica por primera vez. Actualmente, Java no admite muchos WebSockets. Hay muy poca información sobre el marco de implementación de websocket que se puede encontrar en Internet. Todavía no he visto WebSocket agregado a Java EE7. Todos los paquetes son compatibles con tomcat. Se requieren al menos 3 paquetes tomcat-coyote, tomcat-catalina y tomcat-annotations-api, porque tomcat solo admite mejor websocket desde la versión 7.027. En versiones anteriores a tomcat 7.027, websocket ya se puede usar, pero ocurrirán varios problemas. preguntas. Por ejemplo, la conexión websocket se desconectará después de dejarla sola durante unos segundos, etc. Por tanto, una mejor opción es utilizar la versión 7.027 o superior. Estos tres paquetes jar están disponibles en la carpeta lib correspondiente de Tomcat. Desde que entré en contacto con Maven durante mis estudios de posgrado, gradualmente aprendí sobre el poder de Maven y tengo que suspirar aquí. Al tratarse de un equipo pequeño y ágil, el control de versiones es imprescindible. En términos de control del paquete jar, todavía quiero controlarlo a través de maven. Fui directamente a la biblioteca central de Maven y busqué. Efectivamente, todavía quedan algunos. Después de la discusión grupal, decidimos usar tomcat7.039 (parece que se han lanzado 40), lo que resolvió el problema del control de versiones y la configuración del paquete jar. El pom tiene tres paquetes jar para Tomcat de la siguiente manera:
1 2 org.apache.tomcat 3 tomcat-coyote 4 7.0.39 5 6 7 org.apache.tomcat 8 tomcat-catalina 9 7.0.3910 11 12 org. apache.tomcat13 tomcat-annotations-api14 7.0.3915
El siguiente paso es resolver el problema arquitectónico. Hoy en día, hay muy pocas prácticas sobre websocket que se pueden encontrar en Internet. Básicamente, lo que se puede encontrar es la arquitectura de websocket y ejemplos muy simples (tomcat viene con ejemplos de websocket). Primero, el marco básico está preparado para usar hibernate + spring mvc combinado con websocket, pero en experimentos reales, spring mvc y websocket tendrán algunos conflictos. Porque fue solo en la versión lanzada por Spring Framework 4.0 hace algún tiempo que hubo soporte para la programación JDK 8 y WebSocket. Entonces, en esta etapa, se necesitan otras formas de implementar spring mvc+websocket. La solución sencilla es escribir una clase de utilidad para obtener los beans manualmente. El método de interacción de websocket debe resolverse después de que se admitan Spring y websocket. Los dos métodos más directos de websocket son onTextMessage y onBinaryMessage, que son transmisión de flujo de bytes y transmisión de flujo de caracteres. La mejor manera es diseñar su propio protocolo de transmisión. Transmitido mediante flujo de bytes. El front-end y el backend analizan el protocolo por separado para obtener operaciones interactivas. En segundo lugar, puedes armar un escándalo por onTextMessage, que es el flujo de caracteres. La introducción de json puede ser bien compatible.
Pasos para configurar websocket:
1 Implementar una clase que herede ContextLoaderListener y configurarla en web.xml
1 importar javax.servlet.ServletContext 2 importar; javax.servlet.ServletContextEvent; 3 4 importar org.springframework.context.ApplicationContext; 5 importar org.springframework.web.context.ContextLoaderListener; 6 importar org.springframework.web.context.support.WebApplicationContextUtils 7 8 la clase pública SpringLoaderListener extiende ContextLoaderListener; { 9 10 @Override11 contexto vacío público Inicializado (evento ServletContextEvent) {12 super.contextInitialized (evento); 13 ServletContext contexto = evento.getServletContext (); 14 ApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext (contexto); 16 17 }18 19 }
web.xml
1 2 3 XXXXXX.utils.SpringLoaderListener4 5
Obtener la clase de herramienta Spring Bean:
1 importar org.springframework.beans.BeansException; 2 importar org.springframework.beans.factory.NoSuchBeanDefinitionException; 3 importar org.springframework.context.ApplicationContext 4 5 clase pública SpringContextUtil { 6 contexto ApplicationContext estático privado; static ApplicationContext getContext() { 9 return context;10 }11 12 public static void setContext(ApplicationContext context) {13 SpringContextutil.context = context;14 }15 16 public static Object getBean(String name)lanza BeansException{17 return
context.getBean(nombre);18 }19 20 @SuppressWarnings("unchecked")21 objeto estático público getBean(nombre de cadena, tipo requerido de clase) lanza BeansException { 22 return contexto.getBean(nombre, tipo requerido 23 } 24 25 estático público); boolean contieneBean(nombre de cadena) { 26 return contexto.containsBean(nombre); 27 } 28 29 public static boolean isSingleton(nombre de cadena) lanza NoSuchBeanDefinitionException { 30 return contexto.isSingleton(nombre); )34 clase estática pública getType(nombre de cadena) lanza NoSuchBeanDefinitionException { 35 return contexto.getType(nombre); 36 } 37 38 cadena estática pública[] getAliases(nombre de cadena) lanza NoSuchBeanDefinitionException { 39 return contexto.getAliases(nombre); 41 42 43 }
Introduzca el paquete jar requerido para json:
1 2 com.google.code.gson 3 gson 4 2.2.3 5 6 7 net.sf.json- lib 8 json-lib 9 2.410 11 12 net.sf.ezmorph13 ezmorph14 1.0.615
El fondo necesita agregar dos archivos y uno hereda WebSocketServlet:
1 import javax.servlet. annotation.WebServlet; 2 import javax.servlet.mandDispatcher; 5 6 public RoomMessageInbound() { 7 if (commandDispatcher == null) { 8 commandDispatcher = (CommandDispatcherUtils) SpringContextutil.getBean("commandDispatcher"); ).getHabitación (0);10
}11 }12 13 14 @Override15 protected void onOpen(WsOutbound saliente) 16 room.addUser(outbound.hashCode());17 super.onOpen(outbound);18 }19 20 @Override21 protected void onClose(int status) {22 room.remove(getWsOutbound().hashCode());23 super.onClose(status);24 }25 26 @Override27 protected void onBinaryMessage(ByteBuffer buffer) lanza IOException {28 29 }30 31 @Override32 protected void onTextMessage(CharBuffer buffer) ) arroja IOException {33 String msg = buffer.toString();34 JSONObject report = JSONObject.fromObject(msg);35 TemplateCommand comando = commandDispatcher.getCommandByKey(report.getString("command"));36 command.execute(msg, user,room);37 }38 39 }
La cadena se puede convertir en un objeto json mediante JSONObject report = JSONObject.fromObject(msg). Equivale a realizar la transmisión de información de objetos en tiempo real a través de websocket.
En la página de inicio, solo necesita agregarlo al js cuando la página está cargada
1 $(function() { 2 roomsocket = new WebSocket('ws ://127.0.0.1: 8080/XXXX/room);3 }
Cuando el front-end envía los datos al backend, los datos se pueden convertir en json mediante JSON.stringify(data)
Se han realizado muchas eliminaciones en el código anterior. Por lo tanto, no es necesario copiar el código. Además, la nueva versión de Java o Spring Framework 4.0 admitirá fácilmente la implementación de. websocket.Saquemos algunas conclusiones. Con el nacimiento de varias tecnologías nuevas, la tecnología web en tiempo real se ha vuelto cada vez más madura y es una característica importante de HTML5 que vale la pena echarle un vistazo.