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