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

Programación de Websocket

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 lt; dependencia gt2 ltgroupId gtorg . Apache lt /groupId gt; 7.0.39 lt /versión > 5 lt /dependencia > 6 lt dependencia > 7 ltgroupId > torg . Tomcat lt /groupId > 8 ltartifactId > Tomcat-catalina lt; versiongt;10lt;/dependencygt;11lt;dependencygt12lt;groupIdgtorg.Apache.Tomcatlt;/groupIdgt;13lt;artifactIdgtTomcat-annotation-apilt;/artifactidgt;14 lt;version >7.0.39lt/version >15 lt;/dependency >> p>

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 utilizar 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 .servletcontextevent; 3 4 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 lt; .spring loader oyente 4 lt;/listener-class gt;5 lt/listener gt;

Obtener clase de herramienta Spring Bean:

1Importar excepción org.spring framework.beans.beans; 2 importar org.spring framework.beans.factory.nosuchbean definiciónexcepción; 3 importar org.spring framework.context.application contexto; 4 5 clase pública SpringContextUtil { 6 contexto de aplicación estática privada 7 8 contexto de aplicación estática pública obtener contexto () { 9 contexto de retorno; 10 } 11 12 contexto de conjunto vacío estático público (contexto de contexto de aplicación) { 13 contexto de primavera util . contexto; 14 } 15 16 objeto estático público getBean (nombre de cadena) lanza BeansException { 17 contexto de retorno. );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 contexto de retorno. context.containsBean(nombre); 27 } 28 29 public static boolean es singleton(String nombre) lanza nosuchbeandidefinitionexception { 30 return contexto es singleton(nombre) 31 } 32 33 @ suprimir advertencias(" unchecked ") 34 public Static class getType; (Nombre de cadena) lanza nosuchbeanddefinitionexception { 35 contexto de retorno. getType(nombre); 36 } 37 38 cadena estática pública[]getaliasses(nombre de cadena) lanza nosuchbeandetificationexception { 39 contexto de retorno (nombre); p>

Presentación de los paquetes jar necesarios para json:

1 lt; dependencia gt2 ltgroupId gtcom código gson lt;/groupId gt; > 2 2 . 3 lt /versión > 5 lt / dependencia > 6 lt dependencia > 7 ltgroupId > 9 lt versión. >2.4 lt/versión >10 lt;/dependencia >11 lt;dependencia >12 lt;groupId >net .SF .ez morph lt;/groupId >13 lt;artifactId gtezmorph lt/ artefacto id gt 14 lt; 0 . 6 lt; /version gt; 15 lt; /dependency gt;

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

1 Importar servlet. anotación . servlet web; 2 Importar servlet javax .

atcher = (CommandDispatcherUtils) utilidad de contexto de primavera get bean ("despachador de comandos" 9 room = roomlistmodel (). 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 room socket = new web socket(' ws://127.0.0.1:8080/XXXX/room);3}

El json de datos .stringify(data) puede ser json cuando se envía 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. Apoyará fácilmente la implementación de websocket. Esto es principalmente para resumir mi investigación sobre websocket durante este período. Con el nacimiento de varias tecnologías nuevas, websocket en tiempo real se está volviendo cada vez más maduro y vale la pena verlo y estudiarlo.