Um exemplo de push em tempo real do websocket escrito com base na estrutura da primavera, o conteúdo específico é o seguinte
Etapa 1: construir um projeto SpringMVC você mesmo, é muito simples, disponível no Baidu online; Adicione o seguinte arquivo POM:
<!-- WebSocket --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-websocket</artifactId> <version>4.2.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-messaging</artifactId> <version>4.2.4.RELEASE</version> </dependency>
Minha versão da primavera é 4.2.4, então o WebSocket também é 4.2.4; É melhor manter o mesmo que a versão da primavera
Etapa 2: Escreva um processador de mensagens
/** * Nome do projeto: springrabbitmq * Nome do arquivo: myMessageHandler.java * Nome do pacote: com.zsy.websocket * Data: 31 de janeiro de 2018 às 11:10:03 * Copyright (c) 2018, zhaoshouyun todos os direitos reservados. * */ pacote com.zsy.webSocket; importar java.io.ioException; importar java.util.map; importar java.util.set; importar java.util.concurrent.concurrenthashmap; importar org.apache.commons.lang3.StringUtils; importar org.springframework.web.socket.cloSestatus; 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 * Função: Implemente a interface do WebsCoket * Data: 31 de janeiro de 2018 às 11:10:03 * @Author Zhaoshouyun * @Version * @Since JDK 1.7 */public class Usuário MyMessageHandler “ / *** UserMap: armazenando a conexão do usuário Informações da WebsCoket* @since JDK 1.7*/ mapa estático final privado <string, websocketSession> userMap; static {userMap = novo ConcurrentHashMap <String, WebsocketSession> (30); } / *** Este método é chamado ao fechar o websocket* @see org.springframework.web.socket.websockethandler#AfterConnectionClosed (org.springframework.web.socket.websocketsession, org.springframewring.web.socket.losstock.losstock.websockets,) AfterConnectionClosed (Sessão WebSocketSession, Status de próximastatus) lança Exceção {String userId = this.getUserID (sessão); if (stringutils.isnoneBlank (userID)) {userMap.remove (userID); System.err.println ("Este" + UserID + "Usuário foi fechado com sucesso"); } else {System.err.println ("Quando fechado, obtenha o ID do usuário está vazio"); }} / *** Este método é chamado ao estabelecer uma conexão websocket* @see org.springframework.web.socket.websockethandler#postConnectionEstabled (org.springframework.web.socket.websocketSession)* / @Override Public Void AfterConnectled. this.getUserID (sessão); if (stringutils.isnoneBlank (userID)) {userMap.put (userID, sessão); session.sendMessage (New TextMessage ("WebSocket Connection foi estabelecido com sucesso!")); } } /** * When the client calls websocket.send, this method will be called for data communication* @see org.springframework.web.socket.WebSocketHandler#handleMessage(org.springframework.web.socket.WebSocketSession, org.springframework.web.socket.WebSocketMessage) */ @Override public void handleMessage (sessão websocketSession, websocketmessage <?> mensagem) lança a exceção {string msg = message.toString (); String userID = this.getUserID (sessão); System.err.println ("The"+userID+"A mensagem enviada pelo usuário é:"+msg); mensagem = new textMessage ("O servidor recebeu a mensagem, msg ="+msg); session.sendMessage (mensagem); } /** * When an exception occurs in the transmission process, call this method* @see org.springframework.web.socket.WebSocketHandler#handleTransportError(org.springframework.web.socket.WebSocketSession, java.lang.Throwable) */ @Override public void handleTransportError(WebSocketSession session, Throwable e) lança exceção {websocketmessage <string> message = new textMessage ("mensagem de exceção:"+e.getMessage ()); session.sendMessage (mensagem); } / ** * * @see org.springframework.web.socket.websockethandler#supportspartialMessages () * / @Override public boolean SupportSpartialMessages () {return false; } / ** * SendMessageTouser: Envie para o usuário especificado * @Author Zhaoshouyun * @param userID * @param conteúdo * @since jdk 1.7 * / public void sendMessessageTouser (string userID, string content) {websocketSession = useMag.get (userID); if (session! = null && session.isopen ()) {try {textMessage message = new textMessage (conteúdo); session.sendMessage (mensagem); } catch (ioexception e) {e.printStackTrace (); }}} / ** * SendMessageToAllers: Enviar para todos os usuários * @Author Zhaoshouyun * @param Conteúdo * @since Jdk 1.7 * / public void sendMessessageToAlUsers (conteúdo da string) {Set <String> userIds = UserMap.KeySet (); para (string userID: userIDs) {this.sendMessageTouser (userID, conteúdo); }} / ** * getUserId: obtenha ID do usuário * @Author Zhaoshouyun * @param sessão * @return * @since JDK 1.7 * / private String getUserID (sessão websocketSession) {tente {string userID = (string) session.getTributes (). Get (user_key); return userID; } catch (Exceção e) {e.printStackTrace (); } retornar nulo; }}Etapa 3: Escreva a configuração relacionada ao WebSocket, é claro, você pode configurá-lo no XML; Não estou usando a configuração XML agora e uso a configuração de código e preciso adicionar um pacote de varredura no XML <Contexto: componente-Scan Base-Package = "com.zsy.websocket" />
/** * Nome do projeto: SpringrabbitMq * Nome do arquivo: websocketconfig.java * Nome do pacote: com.zsy.websocket * Data: 13:10:33 em 31 de janeiro de 2018 * Copyright (c) 2018, zhaoshouyun todos os direitos reservados. * * / / ** * Nome do projeto: SpringrabbitMq * Nome do arquivo: websocketconfig.java * Nome do pacote: com.zsy.websocket * Data: 13:10:33 em 31 de janeiro de 2018 * Copyright (c) 2018, Zhaoshouyun todos os direitos reservados. * */ pacote 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 * Função: TODO Adicionar função. * Data: 31 de janeiro de 2018 às 13:10:33 * @author zhaoshouyun * @version * @since jdk 1.7 * / @configuration @enablewebsock org.springframework.web.socket.config.annotation.webSocketConfigurer#RegisterWebsocketHandlers (org.springframework.web.socket.config.annotation.websockethlergistry) */ @override VoidwebswebsLebers (WebSockethlerRegistry) */ @override VoidwebsLebersLebers (WebSockethlerRegistry) */ @override VoidwebersLebersLebers (WebSockethlerRegistry)/ @override VoidwebersLebersLebers (WebSockethlerRegistry)/ @override Voidwebswebs) Registry.addhandler (MyHandler (), "/testhandler").addinterceptores(new webSocketIntercept ()); Registry.addhandler (MyHandler (), "/socketjs/testhandler").addinterceptores(new websocketIntercept ()). withsockjs (); } @Bean public websockethandler myHandler () {return new MyMessageHandler (); }} Etapa 4: Escreva um adaptador WebSocket
pacote com.zsy.webSocket; importar java.util.map; importar org.springframework.http.server.serverhttprequest; importar org.springframework.http.server.serverhttpropSe; importar org.springframework.http.server.servletServerhttPrequest; importar org.springframework.web.socket.websockethandler; importar org.springframework.web.socket.server.support.httpSessionHandshakeInterceptor; /** * ClassName: WebSocketInterceptor * Função: TODO Adicionar função. * Data: 31 de janeiro de 2018 às 11:42:34 * @author zhaoshouyun * @version * @since jdk 1.7 * / classe pública websocketinterceptor estende httpsessionhakeInterceptor { / ** * todo descreve brevemente a função de implementação desse método (opcional). * @see org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor#beforeHandshake(org.springframework.http.server.ServerHttpRequest, org.springframework.http.server.ServerHttpResponse, org.springframework.web.socket.websockethandler, java.util.map) */ @Override public boolean antes (ServerhttPrequest Solicy, serverhtpPesponse Respond, WebSocketHandler WSHandler, mapa <string, object> atributes) Throws {se excepctomets, {if (serincesTer Of (MAPT). ServletServerHttPrequest ServerHttPrequest = (ServletServerHttPrequest) solicitação; // Get parameter string userID = serverhttprequest .getServletRequest (). GetParameter ("userID"); atributes.put (myMessageHandler.User_Key, UserID); } retornar true; }} O JS correspondente na Etapa 5:
<%@ Page Language = "java" contentType = "text/html; charset = iso-8859-1" PageEncoding = "ISO-8859-1"%> <! "http://www.w3.org/tr/html4/loose.dtd"> <html> <head> <meta http-equiv = "content-type" content = "text/html; charset = iso-8859-1"> <title> title " // primeiro determina se o websocket é suportado se ('websocket' na janela) {websocket = new websocket ("ws: // localhost: 8085/springtest/testhandler? UserID = zhaoshouyun"); } else if ('mozwebsocket' na janela) {websocket = new mozwebsocket ("ws: // localhost: 8085/springtest/testhandler? userID = zhaoshouyun"); } else {websocket = new Sockjs ("http: // localhost: 8085/springtest/socketjs/testHandler? userID = zhaoshouyun"); } // Ao abrir a conexão, websocket.onopen = function (evnt) {console.log ("websocket.onopen"); }; // Ao receber a mensagem, websocket.onmessage = function (evnt) {alert (evnt.data); }; websocket.onerror = function (evnt) {console.log ("websocket.onerror"); }; websocket.onclose = function (evnt) {console.log ("websocket.onclose"); }; function diz () {// o cliente envia ativamente uma mensagem websocket.send (document.getElementById ('msg'). value); } </script> </ad Head> <body> <input type = "text" value = "" id = "msg"> <button onclick = "say ()"> </botão> </body> </html> Etapa 6 Teste:
pacote com.zsy.test.controller; importar java.util.hashmap; importar java.util.map; importar org.springframework.beans.factory.annotation.autowired; importar org.springframework.beans.factory.annotation.value; importar org.springframework.tereotype.controller; importar org.springframework.web.bind.annotation.requestbody; importar org.springframework.web.bind.annotation.requestmapping; importar org.springframework.web.bind.annotation.ResponseBody; importação com.zsy.websocket.mymessageHandler; /** * ClassName: testController * Função: TODO Adicionar função. * Data: 14 de dezembro de 2017 às 11:11:23 * @author zhaoshouyun * @version * @since jdk 1.7 */ @Controller Classe public TestController {@AUTOWIRED MyMessageHandler Handler; @RequestMapping ("/get") public string get () {return "index"; } @ResponseBody @RequestMapping ("/get1") public string send (nome da string) {Handler.sendMessageTouser ("Zhaoshouyun", "Conteúdo enviado pelo servidor:"+nome); retornar "sucesso"; }}O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.