Un ejemplo de empuje en tiempo real de WebSocket escrito basado en el marco de Spring, el contenido específico es el siguiente
Paso 1: Construya un proyecto SpringMVC usted mismo, es muy simple, disponible en Baidu Online; Agregue el siguiente archivo POM:
< </pendency>
Mi versión de Spring es 4.2.4, por lo que WebSocket también es 4.2.4; Es mejor mantener lo mismo que la versión de primavera
Paso 2: Escriba un procesador de mensajes
/** * Nombre del proyecto: SpringRabbitmq * Nombre del archivo: myMessageHandler.java * Nombre del paquete: com.zsy.websocket * Fecha: 31 de enero de 2018 a las 11:10:03 am * Copyright (c) 2018, ZhaoshohoUyun todos los derechos reservados. * */ paquete com.zsy.websocket; import java.io.ioException; import java.util.map; import java.util.set; import java.util.concurrent.concurrenthashmap; importar org.apache.commons.lang3.stringutils; importar org.springframework.web.socket.cloestatus; importar org.springframework.web.socket.textmessage; importar org.springframework.web.socket.websockethandler; importar org.springframework.web.socket.webSocketMessage; importar org.springframework.web.socket.websocketsession; /** * ClassName: MyMessageHandler * Función: Implementar la interfaz WebScoket * Fecha: 31 de enero de 2018 a las 11:10:03 am * @author zhaoshooshouyun * @version * @since jdk 1.7 */public class MyMessageHandler implementa WebSockethandler {// Usuario clave Público Public Static Final Caded User_Key = "Current_user"; "; / *** Usermap: almacenamiento de la conexión del usuario Información de WebScoket* @Since JDK 1.7*/ Mapa estático final privado <String, WebSocketSession> Usermap; static {usermap = new concurrenthashmap <string, websocketsession> (30); } / *** Este método se llama cuando se cierre WebSocket* @see org.springframework.web.socket.websockethandler#afeConnectionClosed (org.springframework.web.socket.websocketSession, org.springFrameFrameWork.web.socket.cloSestatus)* / @Override Vived ValidectionCleid Cloid Cloid CLAID Estado de cierre) lanza la excepción {String userId = this.getuserId (sesión); if (stringUtils.isNoneBlank (userId)) {usermap.remove (userId); System.err.println ("this" + userid + "user se ha cerrado correctamente"); } else {System.err.println ("Cuando está cerrado, obtenga la identificación del usuario está vacía"); } } /** * This method is called when establishing a websocket connection* @see org.springframework.web.socket.WebSocketHandler#afterConnectionEstablished(org.springframework.web.socket.WebSocketSession) */ @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { String userId = this.getUserId(session); if (stringUtils.isNoneBlank (userId)) {usermap.put (userId, session); session.sendMessage (nuevo TextMessage ("¡Conexión de WebSocket se estableció con éxito!")); }} / *** Cuando el cliente llama a WebSocket.send, se solicitará a este método para la comunicación de datos* @see org.springframework.web.socket.websockethandler#handlemessage (org.springframework.web.socket.websocketsession, org.springframework.web.socket.websocketmessage)* / @oper HandLemessage (Sesión de WebSocketSession, WebSocketMessage <?> Mensaje) lanza la excepción {String msg = message.ToString (); Cadena userId = this.getuserId (sesión); System.err.println ("El mensaje"+UserID+"enviado por el usuario es:"+msg); mensaje = nuevo TextMessage ("El servidor ha recibido el mensaje, msg ="+msg); session.sendMessage (mensaje); } / *** Cuando se produce una excepción en el proceso de transmisión, llame a este método* @see org.springframework.web.socket.websockethandler#handletransporterRor (org.springframework.web.socket.websocketSession, java.lang.throwable)* / @Override public voidransporRorRor (sesionsion session, sesionsion, sesionsion, sesionsion, sesionsion) Lanza la excepción {WebSocketMessage <String> Mensaje = nuevo TextMessage ("Mensaje de excepción:"+E.getMessage ()); session.sendMessage (mensaje); } / ** * * @see org.springframework.web.socket.websockethandler#supportsPartialMessages () * / @Override public boolean SupportsPartialMessages () {return false; } / ** * sendMessageToUser: Enviar al usuario especificado * @author zhaoshooshouyun * @param userid * @param contenidos * @since jdk 1.7 * / public void sendMessageTouser (String UserId, String Contents) {WebSocketSession Session = usermap.get (userId); if (session! = null && session.isopen ()) {try {textMessage Message = new TextMessage (contenido); session.sendMessage (mensaje); } catch (ioException e) {E.PrintStackTrace (); }}} / ** * sendMessageToAllusers: Enviar a todos los usuarios * @author zhaoshohouyun * @param contenidos * @since jdk 1.7 * / public void sendMessageToAllusers (contenido de cadena) {set <tring> userIds = usermap.KeySet (); for (string userId: userIds) {this.sendMessageToUser (userId, contenido); }} / ** * getUserId: obtener ID de usuario * @author zhaoshohohouyun * @param session * @return * @since jdk 1.7 * / private string getUserID (websocketsession session) {try {string userId = (string) session.getAttributes (). get (user_key); devolver el usuario de usuario; } catch (Exception e) {E.PrintStackTrace (); } return null; }}Paso 3: Escriba la configuración relacionada con WebSocket, por supuesto, puede configurarla en XML; No estoy usando la configuración XML ahora, y uso la configuración del código, y necesito agregar un paquete de escaneo en XML <context: componente-scan base-paquete = "com.zsy.websocket" />>
/** * Nombre del proyecto: SpringRabbitmq * Nombre del archivo: WebSocketConfig.java * Nombre del paquete: com.zsy.websocket * Fecha: 1:10:33 PM el 31 de enero de 2018 * Copyright (c) 2018, Zhaoshouyun todos los derechos reservados. * * / / ** * Nombre del proyecto: SpringRabbitmq * Nombre del archivo: WebSocketConfig.java * Nombre del paquete: com.zsy.websocket * Fecha: 1:10:33 PM el 31 de enero de 2018 * Copyright (c) 2018, ZhaoshohoUyun Todos los derechos reservados. * */ paquete com.zsy.websocket; importar org.springframework.context.annotation.bean; importar org.springframework.context.annotation.configuration; importar org.springframework.web.socket.websockethandler; importar org.springframework.web.socket.config.annotation.enableWebSocket; importar org.springframework.web.socket.config.annotation.webSocketConfigurer; importar org.springframework.web.socket.config.annotation.websockethandlerregistry; /** * ClassName: WebSocketConfig * Función: TODO ADD Función. * Fecha: 31 de enero de 2018 a las 1:10:33 pm * @Author Zhaoshohouyun * @Version * @since JDK 1.7 * / @Configuration @enableWebSocket public class WebSocketConfig implementa WebSocketCigurer { / ** * Registre * @Seeeeeeee org.springframework.web.socket.config.annotation.websocketconfigurer#registrowebsockethandlers (org.springframework.web.socket.config.annotation.websockethandlerregistry) */ @override public registre videwebsockethandlers (WebSockethandlerregistryRistry) {Registro Registro "/testhandler").addinterceptors(new WebSocketInterceptor ()); Registry.AddHandler (myHandler (), "/socketjs/testhandler").addinterceptors(new WebSocketInterceptor ()). withsockjs (); } @Bean public WebSocketHandler myHandler () {return nuevo myMessageHandler (); }} Paso 4: Escribe un adaptador WebSocket
paquete com.zsy.websocket; import java.util.map; importar org.springframework.http.server.serverhttprequest; importar org.springframework.http.server.serverhttpresponse; importar org.springframework.http.server.servletserverhttprequest; importar org.springframework.web.socket.websockethandler; importar org.springframework.web.socket.server.support.httpsessionhandshakeinterceptor; /** * ClassName: WebSocketInterceptor * Función: TODO ADD Función. * Fecha: 31 de enero de 2018 a las 11:42:34 AM * @author Zhaoshoossion * @version * @since jdk 1.7 * / public class WebSocketInterceptor extiende httpsessionHandshakeinterceptor { / ** * TODO describe brevemente la función de implementación de este método (opcional). * @see org.springframework.web.socket.server.support.httpsessionhandshakeinterceptor#antes que elhandshake (org.springframework.http.server.serverhttprequest, org.springframework.http.server.serverhttpressesse, org.springframework.web.socket.websockethandler, java.util.map) */ @Override public boolean antes de queHandHandShake (ServerHttprequest Solicitud, Respuesta ServerHttPonse, WebSocketHandler Wshandler, Map <String, Object> Atributes) Excepción {if if if if if if ifi ServletServerHttPrequest ServerHttPrequest = (ServletServerHttprequest) solicitud; // Get Parameter String UserId = ServerHttprequest .getServletRequest (). GetParameter ("UserId"); atributes.put (myMessageHandler.user_key, UserId); } return verdadero; }} El JS correspondiente en el paso 5:
<%@ page lenguaje = "java" contentType = "text/html; charset = iso-8859-1" PageEncoding = "ISO-8859-1"%> <! Doctype html público "-// w3c // dtd html 4.01 transición // en" "http://www.w3.org/tr/html4/loose.dtd"> <html> <fead> <meta http-equiv = "content-type" content = "text/html; charset = iso-8859-1"> <title> title title </title> <script type = "text/javascript"> var varsocket; // Determine primero si WebSocket es compatible si ('WebSocket' en Window) {WebSocket = new WebSocket ("ws: // localhost: 8085/springTest/testHandler? UserId = zhaoshouyun"); } else if ('mozwebSocket' en la ventana) {WebSocket = new MozWebSocket ("ws: // localhost: 8085/springTest/testHandler? userId = zhaoshouyun"); } else {WebSocket = new Sockjs ("http: // localhost: 8085/springtest/socketjs/testHandler? userId = zhaoshohoUyun"); } // Al abrir la conexión, WebSocket.Onopen = function (evnt) {console.log ("WebSocket.Onopen"); }; // Al recibir el mensaje, WebSocket.Onmessage = function (evnt) {alert (evnt.data); }; WebSocket.Onerror = function (evnt) {console.log ("webSocket.onerror"); }; websocket.onclose = function (evnt) {console.log ("webSocket.onclose"); }; función dice () {// El cliente envía activamente un mensaje websocket.send (document.getElementById ('msg'). valor); } </script> </head> <body> <input type = "text" value = "" id = "msg"> <button onClick = "say ()"> </boton> </body> </html> Prueba del Paso 6:
paquete com.zsy.test.controller; import java.util.hashmap; import java.util.map; importar org.springframework.beans.factory.annotation.aUtowired; importar org.springframework.beans.factory.annotation.value; importar org.springframework.stereotype.controller; importar org.springframework.web.bind.annotation.requestbody; importar org.springframework.web.bind.annotation.requestMapping; importar org.springframework.web.bind.annotation.ResponseBody; import com.zsy.websocket.mymessageHandler; /** * ClassName: TestController * Función: TODO ADD Función. * Fecha: 14 de diciembre de 2017 a las 11:11:23 AM * @Author ZhaoshohoUyun * @Version * @Since JDK 1.7 */ @Controller Public Class TestController {@aUtowired MyMessageHandler Handler; @RequestMapping ("/get") public String get () {return "índice"; } @ResponseBody @RequestMapping ("/get1") public String Send (Nombre de cadena) {Handler.SendMessageToUser ("Zhaoshouyun", "Contenido enviado por el servidor:"+Nombre); devolver "éxito"; }}Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.