In diesem Artikel gibt es drei Hauptschritte
1. Nachdem sich der Benutzer angemeldet hat, stellen Sie eine WebSocket -Verbindung her. Die Standardauswahl wird ausgewählt. Wenn der Browser es nicht unterstützt, verwenden Sie Sockjs, um die Verbindung zu simulieren.
2. Nach dem Erstellen einer Verbindung gibt der Server die ungelesene Nachricht des Benutzers zurück.
3. Nachdem der Server verwandte Operationen ausgeführt hat, senden Sie neue Nachrichten an einen bestimmten Benutzer oder alle Benutzer. Feder 4.0.6 (Wählen Sie 4.0+), Tomcat7.0.55
Weblocet Server -Implementierung
WebSocketconfig.java
@Configuration@enableWebmvc@enableWebSocketPublic Class WebSocketConFIGETEWTMVCCONFigurerAdapter Implements WebSocketConFigurer {@Overridepublic void RegisterWebsocketHandhandlers (WebSocketHanderRegistry Registry) {Registry.AddHandler (SystemWebsocketHandler (), "/webocketserver"). AddInterceptors (New WebSockTHATHACTHACHICTERCEPTORE (); Registry.addHandler (SystemWebsocketHander (), "/sockjs/websocketsers").addinterceder(New WebSocketHandShakeInterceptor ()). WithSockjs ();}@beanpublic WebSockThandler SystemWebsocketHandler () {Neue SystemwebsockeThandler ();}}Vergessen Sie nicht, das automatische Scannen dieser Klasse in der Konfigurationsdatei von SpringMVC zu konfigurieren
<Context: component-scan base-package = "com.ldl.origami.websocket" />
@Konfiguration
@EnableWebmvc
@EnableWebsocket
Diese drei bedeuten grob, dass diese Klasse das Laden von Bohnen im @Bean -Modus unterstützt und SpringMVC und WebSocket unterstützt. Es ist nicht sehr genau. Ich habe @enableWebmvc ausprobiert, ohne es hinzuzufügen, und @Configuration unterstützt ursprünglich das automatische Scannen von SpringMVC
Registry.AddHandler (SystemWebsocketHandler (), "/Websocketserver").
Wird verwendet, um die WebSocket -Server -Implementierungsklasse zu registrieren. Der zweite Parameter besteht darin, auf die Websocket -Adresse zuzugreifen.
Registry.AddHandler (SystemWebSockethandler (), "/sockjs/websocketserver")
Dies ist die Registrierungsmethode mit Sockjs
Erstes Systemwebsockethandler.java
public class SystemwebsockeThandler implementiert Websockethandler {private statische landesweit logger logger; privat static Final ArrayList <WEBLOCKETSession> Benutzer; AfterConnectionEtabled (WebSocketSession Session) löst Ausnahme aus {logger.debug ("Verbindung zum WebSocket -Erfolg herstellen ..."); user.add (Sitzung); String username = (String) Sitzung.getAttributes (). WebSocketService.getunReadNews ((String) Session.getAttributes (). get (constants.websocket_username)); Session {// sendMessAgetousers ();}@oversidepublic void Handletransporterror (WebSocketSession -Sitzung, Throwable Exception) löst Ausnahme aus {if (Session.isopen ()) {session.close ();} logger.debug ("WebSocket -Verbindung geschlossen ...). Sitzung, Closestatus conthestatus) löst eine Ausnahme aus {logger.debug ("WebSocket -Verbindung geschlossen ..."); Benutzer.Remove (Sitzung);} @oversidepublic boolean SupportialMessages () {return false;}/*** Senden Sie eine Nachricht an alle Online -Benutzer ** @Param -Botschaft. {try {if (user.isOpen()) {user.sendMessage(message);}} catch (IOException e) {e.printStackTrace();}}}/*** Send a message to a user** @param userName* @param message*/public void sendMessageToUser(String userName, TextMessage message) {for (WebSocketSession user : users) {if (user.getAttributes().get(Constants.WEBSOCKET_USERNAME).equals(userName)) {try {if (user.isOpen()) {user.sendMessage(message);}} catch (IOException e) {e.printStackTrace();}break;}}}}}}Sie können den relevanten Inhalt auf einen Blick verstehen, daher werde ich ihn nicht viel erklären
Dann WebSocketHandShakeInterceptor.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) Anfrage; (String) Session.getAttribute (constants.session_username); Attribute.put (Constants.websocket_username, Benutzername);}} return true;}@oversidepublic void Afterhandshake (ServerhttpRequest -Anforderung, ServerhttPesponse -Antwort, WebSockethandler WsHandler, Ausnahme) {}}}Die Hauptfunktion davon besteht darin, den Benutzernamen in der aktuellen Anfrage zu erhalten und ihn vor dem aktuellen WebSockethandler zu speichern, um den entsprechenden Benutzer für den WebSockeThandler zu bestimmen. Weitere Informationen finden Sie unter httpSessionHandShakeInterceptor
Benutzeranmeldung, um eine WebSocket -Verbindung herzustellen
index.jsp
<script type="text/javascript" src="http://localhost:8080/Origami/websocket/sockjs-0.3.min.js"></script><script>var websocket;if ('WebSocket' in window) {websocket = new WebSocket("ws://localhost:8080/Origami/webSocketServer");} else if ('Mozwebsocket' im Fenster) {WebSocket = new Mozwebocket ("WS: // localhost: 8080/origami/webocketserver");} else {WebSocket = new SocKJs ("http: // localhost: 8080/origami/sockjs/sockjs/stufensocketerver"). {}; WebSocket.onMessage = function (evnt) {$ ("#msgCount").Seien Sie vorsichtig, wenn Sie Socken verwenden
1. wie man diese beiden schreibt
<script type = "text/javaScript" src = "http: // localhost: 8080/origami/webocket/socKJS-0.3.min
2. in 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
Beide Versionen müssen 3.0+ sein
Fügen Sie es dann in diesem Servlet hinzu
<async-supportiert> true </async-supportiert> <servlet> <servlet-name> appserservlet </servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <init-param> <param-name > contextConfigLocation </param-name> <param-value> classPath*: servlet-context.xml </param-value> </init-param> <load-on-Startup> 1 </load-on-Startup> <async-suppored> true </async-supported> </servlet>
Dann werden alle Filter hinzugefügt
<Async unterstützt> true </async-unterstützt>
3. Fügen Sie verwandte Abhängigkeiten hinzu
<Depopenty> <gruppe> com.fasterxml.jackson.core </Groupid> <artifactId> Jackson-Annotationen </artifactid> <version> 2.3.0 </Version> </abhängig> <depeopcy> <gruppe> com.fasterxml.jackson.core </Groupid> <artifa CTID> JACKSON-CORE </artifactId> <version> 2.3.1 </Version> </abhängig> <depeopcy> <gruppe> com.fasterxml.jackson.core </Groupid> <artifactId> Jackson-Databind </artifactId> <version> 2.3.3 </Version> </abhängig
OK, jetzt kann das Websocket normal festgelegt werden
Gibt die ungelesene Nachricht des Benutzers zurück
Nachdem die Verbindung hergestellt wurde, wird die AfterConnection -stellverträte Methode von Systemwebsockethandler eingegeben. Schauen Sie sich den oben genannten Code an und nehmen
Verwenden Sie nach Abfragen von Informationen Session.sendMessage (neuer TextMessage (count + "")); Um es dem Benutzer zurückzugeben, und gehen Sie zurück und gehen Sie.
Drücken Sie Nachrichten an Benutzer auf dem Server
@ControllerPublic Class admincontroller {static logger logger = loggerfactory.getLogger (admincontroller.class);@autowired (fordert = false) private adminService adminService; @BeanPublic SystemWebsocketHander SystemwebsockaTherTer () {) NEW NEW NEW NEW RETTERRECHT NEW NEW NEW RETTERRECHTEN SystemWebSocketHandler ();}@RequestMapPing ("/auditing")@responseBodypublic -String -Auditing (httpServletRequest -Anfrage) {// Int unreadNewsCount = adminService.getunreadNews (Benutzername); "")); Rückgabeergebnis;}}Hier können Sie SendMessAgetouser verwenden, um Informationen an einen Benutzer zu übertragen, oder Sie können SendMessAgetousers verwenden, um Informationen an alle Benutzer zu übertragen.