Hay tres pasos principales en este artículo.
1. Después de iniciar sesión el usuario, establezca una conexión WebSocket. Se selecciona la selección predeterminada. Si el navegador no lo admite, use Sockjs para simular la conexión.
2. Después de establecer una conexión, el servidor devuelve el mensaje no leído del usuario.
3. Después de que el servidor realiza operaciones relacionadas, envíe nuevos mensajes a un cierto usuario o a todos los usuarios. Spring 4.0.6 (Seleccione 4.0+), Tomcat7.0.55
Implementación del servidor de WebSocet
WebSocketConfig.java
@Configuration@enablewebmvc@habilitando la clase de WebSocketConfig WebSocketCig extiende WebMVCConfigurerAdapter implementa WebSocketConfigurer {@OverridePublic Void RegistroWebSocketHandlers (WebSockEntLerRegistry Registry) {Registry.Adddddler (SystemWebSocketHandler (), "/WebSocketServer"). WebSocketHandShakeInterceptor ()); Registry.AddHandler (SystemWebSocketHandler (), "/SockJS/WebSocketServer").addinterceptors(New WebSocketHandShakeInterceptor ()). WithSockJs ();}@beanPublicSockethandler SystemwebsocketHandler () {Regreso New SystemWebsethandler (););No olvide configurar el escaneo automático de esta clase en el archivo de configuración de SpringMVC
<context: componente-scan base-paquete = "com.ldl.origami.websocket" />
@Configuración
@Enablewebmvc
@EnableWebSocket
Estos tres significan aproximadamente que esta clase admite la carga de frijoles en el modo @Bean y admite SpringMVC y WebSocket. No es muy preciso. Intenté @enableWebMVC sin agregarlo, y @Configuration originalmente admite escaneo automático de SpringMVC
Registry.AddHandler (SystemWebSocketHandler (), "/WebSocketServer"). AddInterceptors (New WebSocketHandShakeInterceptor ())
Se utiliza para registrar la clase de implementación del servidor WebSocket. El segundo parámetro es acceder a la dirección WebSocket.
Registry.AddHandler (SystemWebSocketHandler (), "/sockjs/websocketserver").addinterceptors(new WebSockethandShakeinterceptor ()). Withsockjs ();}
Este es el método de registro usando SockJS
First SystemWebSocketHandler.java
El sistema de clase pública SystemWebSockethandler implementa WebSocketHandler {private estático Final Logger Logger; Private Static final ArrayList <SBELSOCKETSESS> usuarios; static {users = new ArrayList <> (); logger = loggerFactory.getLogger (systemwebSockEndler.classs);} AfterConnectionStablised (Session WebSocketSession) lanza la excepción {logger.debug ("conectarse al éxito de WebSocket ..."); ussers.add (session); string username = (string) session.getTributes (). get (constants.webSocket_Username); if (userne! = null) {// QUERTY UNET MENSES session.getAttributes (). get (constants.webSocket_username)); session.sendMessage (new TextMessage (Count + ""));}}@overRidePublic Void HandLemessage (WebSocketSession Session, WebSocketMessage <?> Message) Lanza excepción {// sendMessageToUsers ();}@}@overridePeid HandroidRorRoR session, Throwable exception) throws Exception {if(session.isOpen()){session.close();}logger.debug("websocket connection closed......");users.remove(session);}@Overridepublic void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {logger.debug("websocket connection cerrado ... "); ussers.remove (session);} @overridePublic boolean soportsPartialMessages () {return false;}/*** Enviar mensaje a todos los usuarios en línea ** @param Message*/public Void sendMessAgEToUsers (Message de textMessage) {para (WebSocketSession user: usuarios) {intent {if (user.isePen; Catch (ioException e) {E.PrintStackTrace ();}}}/*** Enviar un mensaje a un usuario ** @param username*@param mensaje*/public void sendMessageToUser (String UserName, TextMessage Message) {for (WebSocketSession User: usuarios) (user.getAttributes (). get (constants.webSocket_username) .equals (username)) {try {if (user.isopen ()) {user.sendMessage (mensaje);}} catch (ioException e) {e.printstacktRace ();} break;}}}}}}Puedes entender el contenido relevante de un vistazo, por lo que no lo explicaré mucho
Entonces WebSockethandShakeInterceptor.java
clase pública WebSocketHandShakeinterceptor implementa HandShakeinterceptor {private static logger = loggerFactory.getLogger (handShakeInterceptor.class);@overridePublic boolean antes ServletServerHttprequest) {ServletServerHttpRequest ServLetRequest = (ServletServerHttprequest) solicitud; Httpsession Session = ServletRequest.getServletRequest (). (String) session.getAttribute (constants.session_username); atributes.put (constants.webSocket_username, username);}} return true;}@overRidePublic Void AfterHandHake (Solicitud de serverHttpRequest, Respuesta ServerHttPResponse, WebSocketHandler Wshandler, excepción de excepción) {}}La función principal de esto es obtener el nombre de usuario en la solicitud actual y guardarlo en el WebSockethandler actual para determinar el usuario correspondiente al WebSockethandler. Para más detalles, consulte HttpsessionHandshakeInterceptor
Inicio de sesión del usuario para establecer una conexión WebSocket
index.jsp
<script type = "text/javaScript" src = "http: // localhost: 8080/origami/webSocket/Sockjs-0.3.min.js"> </script> <script> var websocket; if ('webSocket' in ventaj ('MozwebSocket' en Window) {WebSocket = new MozwebSocket ("ws: // localhost: 8080/origami/webSocketServer");} else {webSocket = new Sockjs ("http: // localhost: 8080/origami/sockjs/webSocketServer");} websocket.onopen = function (eVeT (EVEM (EVEL) {}; websocket.onmessage = function (evnt) {$ ("#msgcount"). html ("(<font color = 'rojo'>"+evnt.data+"</font>)")}; webSocket.onerror = function (evnt) {}; webSocket.onclose = funcion (evnt) {} <script>Tenga cuidado al usar Sockjs
1. Cómo escribir estos dos
<script type = "text/javascript" src = "http: // localhost: 8080/origami/webSocket/Sockjs-0.3.min.js"> </script> webSocket = new Sockjs (http: // localhost: 8080/origami/sockjs/websocketServer);
2. En Web.xml
<Web-app versión = "3.0" xmlns = "http://java.sun.com/xml/ns/javaee" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xsi: esquemalator http://java.sun.com/xml/ns/javaee/web-app_3_1.xsd ">
Versión
web-app_3_1.xsd
Ambas versiones deben ser 3.0+
Luego agrégalo en este servlet
<Sync-supported> true </async-supported> <servlet> <servlet-name> appServlet </servlet-name> <servlet-class> org.springframework.web.servlet.dispatcherservlet </servlet-class> <itin-param> <amamame-naamam > ContextConfigLocation </amamname> <amam-value> classpath*: servlet-confontext.xml </param-value> </ithparam> <load-on-startup> 1 </load on-startup> <async-pported> true </async-supported> </servlet>
Entonces se agregan todos los filtros
<Sync-Apported> True </Async-Supported>
3. Agregar dependencias relacionadas
<Spendency> <MoupRid> com.fasterxml.jackson.core </proupid> <artifactid> Jackson-Annotations </artifactid> <verserse> 2.3.0 </versewers> </dependence> <ependency> <grupid> com.fasterxml.jackson.core </proupid> <artifa ctid> jackson-core </arfactid> <versión> 2.3.1 </versión> </pendency> <pendency> <uproupid> com.fasterxml.jackson.core </groupid> <artifactid> jackson-databind </arifactid> <versión> 2.3.3 </procencia> </pendency>
Ok, ahora el WebSocket se puede establecer normalmente
Devuelve el mensaje no leído del usuario
Después de establecer la conexión, se ingresará el método de SystemWebSockethandler de SystemSockethandler. Mire el código anterior y elimine el nombre de usuario guardado en WebSockethandshakeinterceptor
Después de consultar información, use session.sendMessage (nuevo textMessage (count + "")); Para devolverlo al usuario, regresa y vaya.
Empujar mensajes a los usuarios en el servidor
@ControllerPublic de la clase Admincontroller {static logger logger = loggerFactory.getLogger (admincontroller.class);@autowired (requerido = false) privado adminservice adminService; @BeanPublicWebSocketHandler SystemWebSocketHandler () {return SystemWebSocketHandler (); auditoría (solicitud httpservletRequest) {// int UnreadNeWSCount = AdminService.getUnreadNews (UserName); SystemWebSocketHandler (). SendMessageToUser (UserName, New TextMessage (UnreadNeWSCount + "")); Resultado de retorno;}}Aquí puede usar SendMessageTouser para impulsar la información a un usuario, o puede usar SendMessageTousers para impulsar la información a todos los usuarios.