Programación de Wesocket
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.