プロジェクト概要48:Springboot統合のWebSocketケース
Springbootの特定はのWebSocketは、多くの方法で実装統合が、原理は同じです。
まず、特定のケースを置きます
pom.xmlジャー依存性
<! -のWebSocket - > <依存> <groupIdを> org.springframework.boot </ groupIdを> <たartifactId>春・ブート・スタータのWebSocket </たartifactId> </依存関係>
サーバーは、メッセージを送信します
パッケージcom.hs.web.thirdparty.webconnect。 輸入com.hs.common.util.json.JsonUtil; 輸入はjava.util.ArrayList; 輸入はjava.util.List; パブリック クラスWebConnectionManager { プライベート 静的 WebConnectionManagerインスタンス= 新しいWebConnectionManager()。 プライベートリスト<UpdateListener> changeListenerList。 プライベートWebConnectionManager(){ changeListenerList = 新規のArrayList <UpdateListener> (); } パブリック 静的WebConnectionManagerのgetInstance(){ リターンインスタンス; } 公共 ボイドのaddChangeListener(UpdateListener changeListenerです){ 同期(changeListenerList){ changeListenerList.add(changeListenerです)。 } } 公共 ボイドremoveChangeListener(UpdateListener changeListenerです){ 同期(changeListenerList){ ため(UpdateListenerリスナー:changeListenerList){ 場合(listener.getUid()に等しい(changeListener.getUid())){ changeListenerList.remove(リスナー)。 休憩; } } } } 公共 ボイドのsendMessage(文字メッセージ){ 同期(changeListenerList){ ため(UpdateListenerリスナー:changeListenerList){ listener.updateHandle(メッセージ)。 } } } 公共 ボイドのsendMessage(オブジェクトobj){ // するSystem.out.println( "JsonUtil.toJson(OBJ):" + JsonUtil.toJson(OBJ))。 sendMessage(JsonUtil.toJson(OBJ))。 } プライベート文字列のgetMessage(){ 戻り ヌル。 } パブリック 静的 ボイドメイン(文字列[]引数){ } }
クライアントは、入口を要求します
パッケージcom.hs.web.thirdparty.webconnect。 輸入org.springframework.stereotype.Component; 輸入javax.websocket.OnClose; 輸入javax.websocket.OnMessage; 輸入javax.websocket.OnOpen; 輸入javax.websocket.Session。 輸入javax.websocket.server.ServerEndpoint; インポートにjava.io.IOException; 輸入java.util.logging.Loggerの; @ServerEndpoint(値 = "/モニター" ) @Component パブリック クラスWebSocketServer { プライベートセッションtargetSession。 プライベートUpdateListener changeListenerです。 プライベート 静的 最終ロガーのsyslogger = Logger.getLogger( "syslogの" ); / ** * @説明:链接建立成功时调用的方法 * @param * @return 無効 * @author TangYujie * @日2019年12月12日夜05時11分 * / @OnOpen 公共 のボイドオープン(セッションsession){ この。 targetSession = セッション。 changeListenerです = 新しいUpdateListener(){ @Override 公共ストリングGETUID(){ リターンtargetSession.getId()。 } @Override 公共 ボイドupdateHandle(文字メッセージ){ のsendMessage(メッセージ)。 } }。 WebConnectionManager.getInstance()のaddChangeListener(changeListenerです)。 sysLogger.info( + "***のWebSocketは、セッションIDから開く" targetSession.getId()); } / ** * @説明:收到客户端消息 * @param * @return 無効 * @author TangYujie * @日2019年12月12日夜05時13 * / @OnMessage 公共 のボイドInMessage属性(文字列メッセージ){ } / ** * @説明:连接关闭 * @param * @return ボイド * @author TangYujie * @日2019年12月12日夜05時15分 * / @OnClose 公共 ボイド端(){ WebConnectionManager。 getInstance()removeChangeListener(changeListenerです)。 sysLogger.infoは( + "***のWebSocketは、セッションIDから閉じ、" この.targetSession.getId()); } プライベート 同期 のボイドのsendMessage(文字列のメッセージ){ 試み{ targetSession.getBasicRemote()sendText(メッセージ)。 } キャッチ(例外:IOException e)の{ sysLogger.warning(e.getMessage())。 } キャッチ(IllegalStateExceptionが電子){ sysLogger.warning(e.getMessage())。 } } }
リスナーインタフェースクラス:インタフェースクラスはupdateHandle(データベース処理)とGETUID(取得UID)方法2を定義します
パッケージcom.hs.web.thirdparty.webconnect。 パブリック インターフェースUpdateListener { ボイドupdateHandle(文字列メッセージ) ストリングGETUID()。 }
サーバーは、メッセージを送信します
パブリック 静的 ボイドメイン(文字列[]引数){ Stringデータ =「これはテストメッセージです」。 WebConnectionManager.getInstance()のsendMessage(データ)。 }
分析ショー:
1- WSによってクライアント場合:// IP:ポート/モニタ接続ソケットは、@ServerEndpoint(値=「/モニター」)注釈に従って、標識@OnOpen、すなわち、接続が確立され、WebSocketServer openメソッドを行います。
2オープンUpdateListener方法が実装インタフェースクラス、これはWebConnectionManagerリスト<UpdateListener> changeListenerListを達成するために添加され、そしてupdateHandle UpdateListenerのインタフェースクラスがtargetSession.getBasicRemote()sendText(メッセージ);. Aサービスを実現プッシュメッセージの終わり。
3-場合WebConnectionManager.getInstance()によってサーバのsendMessage(データ)メッセージを送信する場合、この方法は、それによってプッシュメッセージを行う、updateHandle行われる、請求一覧<UpdateListener> changeListenerListを横断します。