この記事には3つの主な手順があります
1。ユーザーがログインしたら、WebSocket接続を確立します。デフォルトの選択が選択されます。ブラウザがそれをサポートしていない場合は、Sockjsを使用して接続をシミュレートします。
2。接続を確立した後、サーバーはユーザーの未読メッセージを返します。
3。サーバーが関連する操作を実行したら、特定のユーザーまたはすべてのユーザーに新しいメッセージをプッシュします。 Spring 4.0.6(選択4.0+を選択)、Tomcat7.0.55
WebSocetサーバーの実装
WebSocketConfig.java
@configuration@enablewebmvc@enablewebsocketpublic class websocketconfig extends webmvcconfigureradapterを実装するwebsocketconfigurer {@overridepublic void registerwebsockethandlers(websockethandlerregistry registry){registry.addhandler(systemcocketherser(inter "/add inters") webCockethandShakeInterceptor()); registry.addhandler(systemwebsockethandler()、 "/sockjs/websocketserver").addinterceptors(NewWebSockEthandShakeInterceptor())。SpringMVCの構成ファイルでこのクラスの自動スキャンを構成することを忘れないでください
<コンテキスト:component-scanベースパッケージ= "com.ldl.origami.websocket" />
@構成
@enablewebmvc
@enablewebsocket
これらの3つは、このクラスが@Beanモードでの豆の負荷をサポートし、SpringMVCとWebSocketをサポートすることを大まかに意味します。それはあまり正確ではありません。 @EnableWebMVCを追加せずに試しましたが、@Configurationは元々SpringMVCの自動スキャンをサポートしています
registry.addhandler(systemwebsockethandler()、 "/websocketetserver")。addInterceptors(new websockethandshakeInterceptor()))
WebSocket Server実装クラスの登録に使用されます。 2番目のパラメーターは、WebSocketアドレスにアクセスすることです。
registry.addhandler(systemwebsockethandler()、 "/sockjs/websocketserver").addInterceptors(New websockethandshakeInterceptor())。withsockjs();}
これは、sockjsを使用した登録方法です
First SystemWebsockethandler.java
パブリッククラスSystemWebsockethandlerは、WebSockethandler {private static final logger logger; private static final arraylist <websocketsession> users; static {users = new arraylist <>(); logger = oggerfactory.getLogger(systemwebsockethandler.class);} AfterConnectionESTABLEDED(webSocketsession Session)スロー例外{logger.debug( "websocket success ..."); users.add(session); string username =(string)session.getTributes()。 session.getattributes()。get(constants.websocket_username)); session.sendmessage(new textmessage(count + ""));}}@overridepublic void handlemessage(websocketsessionセッション、websocketmessage <?>メッセージ)スロー例外Handletransporterror(websocketessessionセッション、スロー可能な例外)スロー例外{if(session.isopen()){session.close();} logger.debug( "websocket connection closht ...."); remove(session);}@overridepublic void afterconectionclosed(eccustatussessessions、shourdatutus soldatutus soldatus soldasessession {logger.debug( "websocket connection closht closht ..."); users.remove(session);} @overridepublic supportspartialmessages(){return false;}/***すべてのオンラインユーザーにメッセージを送信** @paramメッセージ*/public void sendmessagetousers {user.sendmessage(message);}} catch(ioexception e){e.printstacktrace();}}/***ユーザーにメッセージを送信*@param username*@paramメッセージ*/public void sendmessagetouser(string username、textmessage message){for(for websketsessionユーザー:ユーザー:ユーザー: (user.getattributes()。get(constants.websocket_username).equals(username)){try {if(user.isopen()){user.sendmessage(message);}} catch(ioexception e){e.printstacktrace();}}}}}}}}}}}}}}}}}}}}あなたは一目で関連するコンテンツを理解することができるので、私はそれをあまり説明しません
その後、websockethandshakeinterceptor.java
パブリッククラスのWebSockEthandShakeInterceptorは、HandShakeInterceptor {private static logger logger = loggeractory.getLogger(handshakeinterceptor.class);@overridepublic boolean befuthhandshake(serverhttprequest request、serverhtttpresponse response、map ethandler wshandler wshandler servletserverhttprequest){servletserverhttprequest servletrequest =(servletserverhttprequest)request; httpsession session = servletrequest.getservletrequest()。 (string)session.getattribute(constants.session_username); attributes.put(constants.websocket_username、username);}} return true;}@overridepublic void afterhandshake(serverhttprequest request、serverhtttpreSponse応答、websockethandler wshandler、例外){}}}}これの主な機能は、現在の要求でユーザー名を取得し、現在のWebSockethandlerに保存して、対応するユーザーをWebSockethandlerに決定することです。詳細については、httpsessionhandshakeinterceptorを参照してください
ユーザーログインWebSocket接続を確立します
index.jsp
<スクリプトタイプ= "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/origami/oprigami/origami/origani/ (ウィンドウの 'Mozwebsocket'){websocket = new Mozwebsocket( "ws:// localhost:8080/websocketserver");} else {websocket = new sockjs( "http:// localhost:8080/ocrionami/sockjs/sockjs = webnt. {}; websocket.onmessage = function(evnt){$( "#msgcount")。html( "(<font color = 'red'>"+evnt.data+"</font>)")}; websocket.onerror = function(evnt){};sockjsを使用する場合は注意してください
1.これら2つの書き方
<スクリプトタイプ= "text/javascript" src = "http:// localhost:8080/origami/websocket/sockjs-0.3.min.js"> </script> websocket = new sockjs(http:// localhost:8080/origami/sockjs/sockjs/websketserver);
2。web.xmlで
<web-appバージョン= "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 http://java.sun.com/xml/ns/javaee/web-app_3_1.xsd ">
バージョン
web-app_3_1.xsd
両方のバージョンは3.0+でなければなりません
次に、このサーブレットに追加します
<async-supported> true </async-supported> <servlet> <servlet-name> appservlet </servlet-name> <servlet-class> org.springframework.web.servlet.dispatcherservlet </servet-class> <init-param> <init-param> > contextConfiglocation </param-name> <param-value> classpath*:servlet-context.xml </param-value> </init-param> <load-on-startup> 1 </load-on-startup> <async-supported> true </async-supported> </servlet>
その後、すべてのフィルターが追加されます
<async-supported> true </async-supported>
3.関連する依存関係を追加します
<依存関係> groupId> com.fasterxml.jackson.core </groupid> <artifactid> jackson-annotations </artifactid> <バージョン> 2.3.0 </version> </dependency> <依存関係> <依存> <グループctid> jackson-core </artifactid> <バージョン> 2.3.1 </version> </dependency> <dependency> <groupid> com.fasterxml.jackson.core </groupid> <artifactid> jackson-databind </artifactid> <バージョン> 2.3.3 </バージョン> </despency>
OK、これでWebSocketは正常に確立できます
ユーザーの未読メッセージを返します
接続が確立された後、SystemWebsockethandlerのAfterConnectionStabled Methodが入力されます。上のコードを見て、WebSockethandShakeInterceptorで保存されているユーザー名を取り出します
情報を照会した後、SESSION.SENDMESSAGE(new TextMessage(count + ""))を使用します。それをユーザーに返し、戻って行きます。
サーバー上のユーザーにメッセージをプッシュします
@controllerpublic class admincontroller {static logger logger = loggerfactory.getLogger(admincontroller.class);@autowired(false = false)プライベートアドミンサービスアドミンシェルビス; SystemWebsockethandler();}@requestMapping( "/auditing")@ResponseBodyPublic String auditing(httpservletrequest request){// int unreadnewscount = adminservice.getunreadnews(username); SystemWebsockethandler()。 結果;}}ここでは、SendMessageTouserを使用して情報をユーザーにプッシュするか、SendMessageTousersを使用してすべてのユーザーに情報をプッシュすることができます。