Il y a trois étapes principales dans cet article
1. Après que l'utilisateur se connecte, établissez une connexion WebSocket. La sélection par défaut est sélectionnée. Si le navigateur ne le prend pas en charge, utilisez SOCKJS pour simuler la connexion.
2. Après avoir établi une connexion, le serveur renvoie le message non lu de l'utilisateur.
3. Une fois que le serveur a effectué des opérations connexes, appuyez sur de nouveaux messages vers un certain utilisateur ou tous les utilisateurs. Spring 4.0.6 (SELECT 4.0+), Tomcat7.0.55
Implémentation du serveur Webcocet
WebSocketConfig.java
@ Configuration @ activerwebmvc @ activerwebsocketpublic class WebsocketConfig étend WebMVCConfiGureAdapter implémente WebSocketConfigurer {@OverridePublic Void RegisterWebSockethAndlers (WebSockethAndlerGistry Registry) {Registry.AddDhandler (NewWebSocketHandler (), "/ WebSocketSer"). WebSockethandShakeInterceptor ()); registry.addhandler (systemwebsockethandler (), "/sockjs/websocketserver").AddInterceptors(NEW WebSockethandShakeInterceptor ()). WithSockjs ();} @ beanpublic Websockethandler Systemwebsockethandler () {Retour New SystemwebSockethandler ();N'oubliez pas de configurer la numérisation automatique de cette classe dans le fichier de configuration de Springmvc
<Context: Component-Scan Base-Package = "com.ldl.origami.websocket" />
@Configuration
@Enablewebmvc
@Enablewebsocket
Ces trois signifient à peu près que cette classe prend en charge le chargement des haricots en mode @Bean et prend en charge SpringMVC et WebSocket. Ce n'est pas très précis. J'ai essayé @enablewebmvc sans l'ajouter, et @configuration prend à l'origine prend en charge la numérisation automatique de Springmvc
registry.addhandler (systemwebsockethandler (), "/ WebsocketServer").
Utilisé pour enregistrer la classe d'implémentation WebSocket Server. Le deuxième paramètre consiste à accéder à l'adresse WebSocket.
registry.addhandler (systemwebsockethandler (), "/sockjs/websocketserver":
Ceci est la méthode d'enregistrement à l'aide de sockjs
First Systemwebsockethandler.java
classe publique SystemWebsockethandler implémente WebSockethandler {Logueur final statique privé; Logger privé Static Final ArrayList <WebSocketSession> Utilisateurs; statique {utilisateurs = new ArrayList <> (); logger = loggerfactory.getLogger (SystemWebsockethandler.clasS AfterConnectionEstAbhed (WebSocketSession Session) lève une exception {logger.debug ("Connecter à la réussite WebSocket ..."); users.add (session); String username = (String) session.getAttributes (). get (constants.websocket_username); if (username! = null) {// mass-intred int. session.getAttributes (). get (constants.websocket_userName)); session.sendMessage (new TextMessage (count + ""));}} @ Message OverRidepublic lance une exception {// SendMessageSeSeSeSeSeSeSETSAGE <? HandleTransporterror (Session WebSocketSession, exception throwable) lève une exception {if (session.isopen ()) {session.close ();} logger.debug ("connexion WebSocket fermée ......"); users.remove (session); e ryde {logger.debug ("connexion WebSocket fermée ..."); users.remove (session);} @ overdepublic booléen supportSpartialMessages () {return false;} / *** Envoyer un message à tous les utilisateurs en ligne ** @param message * / public void SendMessageSers (TextMessage. gens (user.getAttributes (). get (constants.websocket_username) .equals (nom d'utilisateur)) {try {if (user.isopen ()) {user.sendMessage (message);}} catch (ioException e) {e.printStackTrace ();} brisé;}}}}}}}Vous pouvez comprendre le contenu pertinent en un coup d'œil, donc je ne l'explique pas beaucoup
Puis WebsockethandShakeInterceptor.java
classe publique WebsockethandShakeInterceptor implémente HandshakeInterceptor {private static logger Logger = loggerFactory.getLogger (HandshakeInterceptor.class); @ OverRidepublic Boolean AVANDANDSHAKE (ServerHttprequest Demande, ServerHttpResponse Réponse, exception IFHandler, IF (If (Instantof. ServletserverHttpRequest) {servletserverHttpRequest serpletRequest = (ServletserverHttpRequest); httpSession session = serpletRequest.getServletRequest (). GetSession (false); if (session! = Null) {// user nom userny pour distinguish websockethandleter dans le commandement pour un ordre de la chaîne de la chaîne de la chaîne de la chaîne pour dissuader WebSockethandler dans le commandement de l'ordre pour un ordre pour un ordre de disser (String) session.getAttribute (constants.session_username); Attributes.put (constants.websocket_username, nom d'utilisateur);}} return true;} @ OverRidepublic void Afterhandshake (ServerHttpRequest Request, ServerHttpResponse Response, WebSockethandler wshandler, exception exception) {}}}La fonction principale de ceci est d'obtenir le nom d'utilisateur dans la demande actuelle et de l'enregistrer sur le WebSockethandler actuel pour déterminer l'utilisateur correspondant à WebSockethandler. Pour plus de détails, veuillez vous référer à HttSessionHandshakeInterceptor
Connexion de l'utilisateur pour établir une connexion WebSocket
index.jsp
<script type = "text / javascript" src = "http: // localhost: 8080 / origami / websocket / sockjs-0.3.min.js"> </ script> <script> var Websock ('Mozwebsocket' dans la fenêtre) {WebSocket = new Mozwebsocket ("ws: // localhost: 8080 / origami / WebsocketServer");} else {WebSocket = new sockjjs ("http: // localhost: 8080 / origami / sockjs / websocketerver");} websocket.onOpenn = furet) {}; Websocket.onMessage = function (evnt) {$ ("# msgcount"). html ("(<font color = 'red'>" + evnt.data + "</font>)")}; Websocket.onerror = function (evnt) {}; Websocket.Onclose = function (evnt) {} </ script>Soyez prudent lorsque vous utilisez SOCKJS
1. Comment écrire ces deux
<script type = "Text / javascript" src = "http: // localhost: 8080 / origami / Websocket / sockjs-0.3.min.js"> </ script> WebSocket = new sockjs (http: // localhost: 8080 / origami / sockjs / WebCoCchetver);
2. Dans web.xml
<web-app version = "3.0" xmlns = "http://java.sun.com/xml/ns/javaee" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" http://java.sun.com/xml/ns/javaee/web-app_3_1.xsd ">
Version
web-app_3_1.xsd
Les deux versions doivent être 3.0+
Puis ajoutez-le dans ce servlet
<async-supported> true </ async-supporté> <Serplet> <Servlet-Name> Appservlet </ servlet-name> <Servlet-Class> org.springframework.web.servlet.dispatcherServlet </ Servlet-Class> <Init-Param> <paramd-nom-nom > contextConfigLocation </ param-name> <param-value> classpath *: servlet-context.xml </ param-value> </ init-param> <ony-on-startup> 1 </ losh-on-startup> <async-supported> true </ async-supported> </vretlet>
Ensuite, tous les filtres sont ajoutés
<async-supporté> true </ async soutenu>
3. Ajouter des dépendances connexes
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.3.0</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifa ctid> jackson-core </ artifactid> <version> 2.3.1 </-version> </dependency> <dependency> <proupId> com.fasterxml.jackson.core </proncId> <ArtefactId> Jackson-databind </retifactive> <version> 2.3.3 </DERNIFRICATION> </Dedency>
OK, maintenant le WebSocket peut être établi normalement
Renvoie le message non lu de l'utilisateur
Une fois la connexion établie, la méthode de reprise de connexion de SystemWebsockethandler sera entrée. Regardez le code ci-dessus et retirez le nom d'utilisateur enregistré dans WebSockethandShakeInterceptor
Après interrogation d'informations, utilisez Session.SendMessage (new TextMessage (count + "")); Pour le retourner à l'utilisateur, et revenir et partir.
Appuyez sur des messages vers les utilisateurs du serveur
@ControllerPublic Class AdminController {static logger logger = loggerfactory.getLogger (adminController.class); @ autowired (obligatoire = false) AdminService privé AdminService; @BeanPublic SystemWebsocketHethandler SystemWebsockethandler () {new New Systemwebsockethandler ();} @ requestmapping ("/ audit") @ réponse auditing de chaîne de réponse (httpServLequest) {// int non-cadewscount = adminervice.getUnreadNews (username); systemwebsockethandler (). résultat;}}Ici, vous pouvez utiliser SendMessageSer pour pousser des informations à un utilisateur, ou vous pouvez utiliser SendMessageTousers pour pousser des informations à tous les utilisateurs.