Existem três etapas principais neste artigo
1. Depois que o usuário faz login, estabeleça uma conexão WebSocket. A seleção padrão é selecionada. Se o navegador não o suportar, use o SOCKJS para simular a conexão.
2. Depois de estabelecer uma conexão, o servidor retorna a mensagem não lida do usuário.
3. Depois que o servidor executa operações relacionadas, envie novas mensagens para um determinado usuário ou para todos os usuários. Spring 4.0.6 (selecione 4.0+), TomCat7.0.55
Implementação do WebSocet Server
WebSocketConfig.java
@Configuration@EnableWebMvc@EnableWebSocketpublic class WebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer {@Overridepublic void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {registry.addHandler(systemWebSocketHandler(),"/webSocketServer").addInterceptors(new WebsockethandshakeIntercept ()); Registry.addhandler (SystemwebsocketHandler (), "/sockjs/websocketServer").addinterceptores(new websockethandshakeinterceptEcept (). Withsockjs ();}@beanpublic WebSockethler (). SystemWebsocketHandler ();}}Não se esqueça de configurar a digitalização automática desta classe no arquivo de configuração do SpringMVC
<Contexto: component-scan Base-Package = "com.ldl.origami.websocket" />
@Configuração
@Enablewebmvc
@Enablewebsocket
Esses três significam aproximadamente que essa classe suporta o carregamento de feijões no modo @Bean e suporta Springmvc e WebSocket. Não é muito preciso. Eu tentei @enablewebmvc sem adicioná -lo, e @configuration suporta originalmente a digitalização automática de springmvc
Registry.addhandler (SystemWebsocketHandler (), "/WebSocketServer"). Addinterceptores (novo WebSocketHandShakeInterceptor ())
Usado para registrar a classe de implementação do WebSocket Server. O segundo parâmetro é acessar o endereço do WebSocket.
Registry.addhandler (SystemwebsocketHandler (), "/sockjs/websocketServer").addinterceptores(new websockethandshakeInterceptor ()). withsockjs ();}
Este é o método de registro usando Sockjs
Primeiro SystemWebsocketHandler.java
public class SystemwebsocketHandler implementa websockethandler {private estático final Logger Logger; private Static Final ArrayList <WsocketSession> users; static {users = new ArrayList <> (); Logger = LoggerFabedPrivItrate (SystemWebSocketHandler.Class);@@@autrowiredPrivItrate (SystemWebSocketHandler.Class);@@@autrowiredPerrivErtErTeTrate (SystemWebSocketHandler. AfterConnectionEstabled (WebSocketSession) lança Exceção {Logger.debug ("Conecte -se ao sucesso do webSocket ..."); Users.add (session); string userName = (string) session.getAttributes (). session.getAttributes (). get (constants.websocket_username)); session.sendMessage (new textMessage (count + ""));}}@substituir public void handleMessage (sessão de websagetsSession, websocketmessage <? handleTransporterror (sessão websocketSession, exceção de arremesso) lança a exceção {if (session.isopen ()) {session.close ();} logger.debug ("conexão websocket fechada ......"); userts.Remove (sessão);}@substituir o anúncio do vazio após a explicação (); {logger.debug("websocket connection closed...");users.remove(session);}@Overridepublic boolean supportsPartialMessages() {return false;}/*** Send message to all online users** @param message*/public void sendMessageToUsers(TextMessage message) {for (WebSocketSession user : users) {try {if (user.isOpen()) {user.sendMessage (message);}} catch (ioexception e) {e.printStackTrace ();}}}/*** Envie uma mensagem para um usuário ** @param userName*@param mensagem*/public void sendMessageSer (string userName, textMessage) {para (para (public void sendMessageSer (string userName, textMessage) {para (para (público (user.getAttributes (). get (constants.websocket_username) .equals (nome de usuário)) {try {if (user.isopen ()) {user.sendMessage (message);}} Catch (ioException e) {e.printstacktrace ();}}}};Você pode entender o conteúdo relevante de relance, então não vou explicar muito
Em seguida, websockethandshakeIntercept.java
public class WebSocketHandshakeInterceptor implements HandshakeInterceptor {private static Logger logger = LoggerFactory.getLogger(HandshakeInterceptor.class);@Overridepublic boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {if (request instanceof ServletServerHttPrequest) {ServletServerHttPrequest ServletRequest = (ServletServerHttPrequest) request; httpSession Session = servletRequest.getServletRequest (). (String) session.getAttribute (constantes.session_username); atributes.put (constantes.websocket_username, nome de usuário);}} retornar true;}@substituir o Substiturpublic void após o MandhShake (Solicitação de servidorhttprequest, resposta serverhttproponse, websockethandler wshandler, exceção de exceção) {}}}}}}}A principal função disso é obter o nome de usuário na solicitação atual e salvá -la no WebSockethandler atual para determinar o usuário correspondente ao WebSockethandler. Para detalhes, consulte HTTPSessionHandshakeInterceptor
Faça login do usuário para estabelecer uma conexão WebSocket
index.jsp
<script type = "text/javascript" src = "http: // localhost: 8080/origami/websocket/sockjs-0.3.min.js"> </script> <cript> var websocket; if ('websocket' in window) {websocket = new websocket ("ws: // localhost; ('Mozwebsocket' na janela) {webSocket = new Mozwebsocket ("ws: // localhost: 8080/origami/websocketServer");} else {websocket = new sockjs/ebocketersver "); {}; websocket.onMessage = function (evnt) {$ ("#msgCount"). html ("(<font color = 'Red'>"+evnt.data+"</font>)")}; websocket.onerror = function (evnt) {}; websocket.onClose = funclose (funclose) (função) {} {};Tenha cuidado ao usar meias
1. Como escrever esses dois
<script type = "text/javascript" src = "http: // localhost: 8080/origami/websocket/sockjs-0.3.min.js"> </script> websocket = new sockjs (http: // localhost: 8080/origami/sockjs/webser;
2. Em web.xml
<Web-App Version = "3.0" xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_1.xsd ">
Versão
web-app_3_1.xsd
Ambas as versões devem ser 3,0+
Em seguida, adicione -o neste servlet
<sync-suported> TRUE > ContextConfigLocation </amon-name> <amam-value> ClassPath*: servlet-context.xml </param-value> </irit-param> <adarot-on-startup> 1 </olload-on-startup> <sync-suported> true </sync-Sobported> </ervlet>
Então todos os filtros são adicionados
<Sync-suported> True </sync-suported>
3. Adicione dependências relacionadas
<Depencency> <PuerpId> com.fasterxml.jackson.core </groupid> <ArtifactId> Jackson-Annotações </ArtifactId> <versão> 2.3.0 </sipers> </dependency> <pendency> <voupidId> com.fasterxml.jackson.core </proupid> <stifa ctid> jackson-core </storkactid> <versão> 2.3.1 </sipers> </dependency> <pendency> <puperid> com.fasterxml.jackson.core </foupid> <stifactId> jackson-databind </stifactId> <versão 2.3.3 </versão </dependência>
Ok, agora o webSocket pode ser estabelecido normalmente
Retorna a mensagem não lida do usuário
Depois que a conexão for estabelecida, o método do SystemWebSockethler de SystemWebSockethler será inserido. Olhe para o código acima e retire o nome de usuário salvo em WebsockethandshakeInterceptor
Após consultar informações, use session.sendMessage (novo textMessage (contagem + "")); para devolvê -lo ao usuário e voltar e ir.
Empurre mensagens para os usuários no servidor
@ControllerPublic Classe Admincontroller {estático logger Logger = LoggerFactory.getLogger (Admincontroller.class);@Autowired (requerido = false) Adminservice Adminservice; @BeanPublic SystemWebSockethAndler SystemwebsocketHandler () {Return New SystemwebsocketHandler ();}@requestmapping ("/auditing")@ResponseBodyPublic String Auditing (httpServletRequest request) {// int UNREADNEWSCOUNT = Adminservice.GetUnReadNews (UserName); SystemwebetHandler (). SendmEssagetUsser (Username); resultado;}}Aqui você pode usar o SendMessageTouser para impulsionar as informações para um usuário, ou pode usar o SendMessageTousers para impulsionar informações a todos os usuários.