Red de conocimiento informático - Problemas con los teléfonos móviles - Programación de Wesocket

Programación de Wesocket

Recientemente, tuve que jugar un juego web por necesidad. La página debe actualizarse en tiempo real a una hora determinada. La idea común actual para crear sitios web es la encuesta js. Debido a que es un pequeño proyecto innovador, los amigos del mismo grupo propusieron el WebSocket mencionado en html5 y realizaron una investigación técnica primero. Actualmente, no hay muchos WebSockets compatibles con Java. Hay muy poca información en Internet sobre el marco de implementación de websocket. Nunca he visto a Java EE7 agregar WebSocket. Entonces todos los paquetes provienen del soporte de Tomcat. Se requieren al menos tres paquetes, tomcat-coyote, tomcat-catalina y tomcat-annotations-api, porque tomcat ha admitido websocket desde la versión 7.027. Websocket se ha utilizado antes de la versión 7.027, pero se producirán varios problemas. Por ejemplo, el websocket se desconectó después de unos segundos de conexión. Por tanto, una mejor opción es utilizar la versión 7.027 o superior. Estos tres paquetes jar están en la carpeta lib de Tomcat correspondiente. Desde que entré en contacto con Maven durante mis estudios de posgrado, gradualmente aprendí sobre el poder de Maven y tengo que suspirar aquí. Como somos un equipo pequeño y ágil, el control de versiones es imprescindible. Todavía quiero controlar el paquete jar a través de maven. Así que fui directamente a la biblioteca central de Maven y busqué. Realmente lo hay. Después de una discusión grupal, decidimos usar tomcat7.039 (parece que se han lanzado 40), que resolvió los problemas de control de versiones y configuración del paquete jar. Los tres paquetes jar de Pom para tomcat3 son los siguientes:

1<dependency>2<groupId> <dependencia>7<groupId>org.Apache .Tomcat</ groupId>8<artifactId>Tomcat-catalina</artifact id>9<version>7.0.39</version>10</dependency>11<dependency>gt12<groupId>org.Apache.Tomcat</groupId> ;13<artifactId>Tomcat-anotaciones-API</ artefactoid>14<Version>7.0.39</ version>15</dependency>

El siguiente paso es resolver el problema arquitectónico. En la actualidad, se encuentran muy pocas prácticas sobre websocket en Internet. Básicamente son arquitectura de websocket y ejemplos muy simples (tomcat viene con ejemplos de websocket). ¿Cómo utilizar el mecanismo websocket? En primer lugar, el marco básico es usar hibernate + spring mvc combinado con websocket, pero habrá algunos conflictos entre spring mvc y websocket en experimentos reales. Porque hasta hace algún tiempo, la versión lanzada por Spring Framework 4.0 no admitía la programación JDK 8 y WebSocket. Entonces, en esta etapa necesitamos 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 que debe resolverse después de que se resuelva el soporte de 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, respectivamente. La mejor manera es diseñar su propio protocolo de transmisión. Transmisión de flujo de bytes. El frontend y el backend analizan el protocolo respectivamente 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.

Para configurar websocket:

1 Implementar la clase que hereda ContextLoaderListener y configurarla en web.xml

1 Importar contexto de servlet 2. Importar javax.servlet.servletcontextevent; 3. importar org. contexto de aplicación. 7 8 clase pública SpringLoaderListener extiende ContextLoaderListener { 9 10 @ anular 11 contexto vacío público inicializado (evento Se rvletContextEvent) { 12 contexto super. . getrequiredwebapplicationcontext(context);15 springcontextutil .set context(CTX);16 17 }18 19 }

web.xml

1<listener>2<Listener class & gt3 XXXXXX . oyente 4 & lt;/listener-class & gt; 5 & lt/listener & gt;

Obtenga la clase de herramienta Spring Bean:

1 Importar Spring Beans. excepción de frijoles; 2 importar org. marco de primavera. fábrica de frijoles. nosuchbean contexto de aplicación estática 7. 8 contexto de aplicación estática pública. (){ 9 contexto de retorno; 11 12 contexto de conjunto vacío estático público (contexto de contexto de aplicación) { 13 utilidad de contexto de primavera = contexto 14 } 15 16 objeto estático público getBean (nombre de cadena) tirar BeansException {17 contexto de retorno; get bean(nombre); 18 } 19 20 @ suprimir advertencias (" sin marcar ") 21 objeto estático público getBean (nombre de cadena, tipo requerido de clase) lanza una excepción de beans { 22 return.

contexto. get bean(nombre, tipo requerido); 23 } 24 25 booleano estático público contiene bean(nombre de cadena) { 26 return contexto.containsBean(nombre) 27 } 28 29 booleano estático público es singleton(nombre de cadena) lanza nosuchbeandidefinitionexception { 30 contexto de retorno es singleton (nombre); 31 } 32 33 @ suprimir advertencias ("sin marcar") 34 clase estática pública getType (nombre de cadena) lanza nosuchbeandidefinitionexception { 35 contexto de retorno (nombre); []getaliasses(String name) lanza nosuchbeandetificationexception { 39 return context . getaliasses(name); 41 42 43 }

Presentando el paquete jar requerido para json:

1<dependencies>2<groupId>com. .Google.code.gson</groupId>3<artifactId>gson</artifact id>4<version>2.2.3& lt;/version>5</dependency>6<dependency>7<groupId>net.SF.JSON-lib</groupId>8<artifactId> JSON-lib<identificador de artefacto>9<versión>t2.4< /version>10</dependency>11<dependency>t12<groupId>net.sf.ez-morph> lt;/groupId>13<artifactId>ezmorph</artifact id>14<Version>1.0.6</version>15</dependency&g t; >

Es necesario agregar dos archivos en segundo plano, uno hereda WebSocketServlet:

1. Importar servlet web javax. Roomsessageinbound () { 7 if (despachador de comandos == null) { 8 despachador de comandos = (CommandDispatcherUtils) utilidad de contexto de primavera get bean ("despachador de comandos");

getRoom(0);10 } 11 } 12 13 14 @ anular 15 protected void en open(ws saliente saliente)16 adduser(saliente. hashcode()); 17 super.onOpen(saliente); 21 void protegido en close(int status){ 22 room . remove(getWsOutbound().hashCode()); 23 super.onClose(status) 25 26 @Override27 void protegido en mensaje binario (búfer de bytes) lanza io excepción { 28 29 } 30 31 @ anular 32 vacío protegido en mensaje de texto (búfer de caracteres) lanza excepción io { 33 Mensaje de cadena = buffer 34 Informe de objeto JSON = objeto JSON (mensaje 35); comando comando = despachador de comandos . getcommandbykey(report . getstring(" comando ")); 36 comando.execute(mensaje, usuario, habitación }38 39 }

Sí Convierte la cadena en un objeto JSON); a través de json Object Report = Objeto JSON. del objeto (mensaje). 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 necesitas agregarla a js cuando se carga la página.

1 $(function(){ 2 socket de habitación = nuevo socket web(' ws://127 . 0 . 0 . 1:8080/XXXX/room); 3 }

Los datos json.stringify(data) pueden ser json cuando se envían al backend.

El código anterior se ha eliminado mucho, por lo que no es necesario copiarlo y solo proporciona una solución Java. o Spring Framework 4.0 admitirá fácilmente la implementación de websocket. Esto es principalmente para resumir mi investigación sobre websocket durante este período. Con la aparición de varias tecnologías nuevas, la tecnología web en tiempo real se está volviendo cada vez más madura y vale la pena verla y estudiarla.