次のチュートリアルは、私が会社の開発に参加し、関連情報を整理した会社のCRMシステムです。システムには多くのメッセージプッシュ機能があり、WebSocketテクノロジーが使用されています。次のエディターがコンパイルされ、リファレンスのためにウーリンネットワークプラットフォームでそれを共有しました
1。メイブン依存関係
<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.3. 0 </version> </dependency> <dependency> <groupid> com.fasterxml.jackson.core </groupid> <artifactid> jackson-core </artifactid> <version> 2.3.0 </version> </dependency> <dependency> <groupid> com.fasterxml.jackson.core </groupid> <artifactid> jamsson -databind </artifactid> <version> 2.3.0 </version> </dependency> <dependency> <groupid> org.springframework </groupid> <artifactid> spring-websocket </artifactid> <バージョン> 4.0.1。リリース</version> </dependency> <dependency> <groupid> org.springframework </groupid> <artifactid> spring-messaging </artifactid> <バージョン> 4.0.1.release </version> </dependency>
2。スプリングセルット構成
<?xmlバージョン= "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns:context = "http://www.springframework.org/schema/cont ext "xmlns:mvc =" http://www.springframework.org/schema/mvc "xmlns:tx =" http://www.springframework.org/schema/tx " xmlns:xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns:websocket = "http://www.springframework.org/schema/websocket" xsi:schemalocation = "http://ww .springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.1.xsdhttp://www.springframework.org/schema/context/spring -context-3.1.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.o rg/schema/mvc/spring-mvc-3.1.xsdhttp://www.springframework.org/schema/txhttp://www.spr ingframework.org/schema/tx/spring-tx-3.1.xsdhttp://www.springframework.org/schema/www.springframework.org/schema/websocket/spring-websocket.xxd」 id = "websocket"/> <websocket:handlers> <websocket:マッピングパス= "/websocket" handler = "websocket"/> <websocket:handshake-interceptors> <bean/> <websocket:Handshake-interceptors> </websocket:Handlers> </beans>
その中で、パスに対応するパスは、前のセクションのWSプロトコルを介して調整されたインターフェイスパスです。
3。ハンドシェイクインターセプターの実装
パッケージcn.bridgeli.websocket; import cn.bridgeli.utils.usermanager; Import cn.bridgeli.util.dateutil; Import cn.bridgeli.sharessions.userinfo; Import org.apache.commons.lang.stringutils; Import org.slf4j.logger; org.slf4j.loggerfactory; import org.springframework.http.server.serverhttprequest; Import org.springframework.http.server.server.server.serverhttpresponse; Import org.springframework.web.context.request.request.request.Request.Request.RequeStexter org.springframework.web.context.request.servletrequestattributes; Import org.springframework.web.socket.websockethandler; import org.springframework.web.socket.server.support.httpssessionhandshakeinterceptor; Import java.util.till.util java.util.map;/*** @description:ハンドシェイクインターフェイスを作成*@date:16-3-3*/public class handshakeinterceptor extends httpsessionhhndshakeinterpector {private static final logger logger = loggerfactory.getlogger(handshakeinterceptor.class);リクエスト、serverhttpresponse応答、websockethandler wshandler、map <string、object> astributes)throws {ogger.info( "ハンドシェイクを作成する前に..."); servletRequestattributes attrs =(servletRequestattributes)requestContextholder.getRequesttributes =; usermanager.getSessionSuser(attrs.getRequest()); usersocketvo usersocketvo = new usersocketvo(); string email = ""; if(null!= curruser){email = curruser.getemail();} if(stringutils.isblank(email)){email = dateutil.date2string(new new new date());} usersocketvo.setuseremail(email); attributes.put( "session_user"、usersocketvo); super.beforehandshake(request、response、wshandler、属性);}@overridepublic afterhandshake(serverhttprequest request、serverhtttpresponse応答、websockethandler wshandler、例外ex)よくわからないので、元のコードを最大限に保ちます。これは、実際に現在のログインユーザーをシングルサインインから取り出し、ユーザーSocketvoオブジェクトに変換し、マップに配置することです。それでは、usersocketvoオブジェクトの定義を見てみましょう
4。usersocketvoの定義
パッケージcn.bridgeli.websocket; import org.springframework.web.socket.websocketsession; import java.util.date;/*** @description:ユーザーソケット接続エンティティ*@date:16-3-7*/public class usersocketvo {private string usermail; //ユーザーメールプライベート日付接続時間。 //接続時間の成功プライベート日付前日の前日。 //最後のリクエスト時間プライベートデートnewRequesttime; //新しいリクエスト時間プライベートデートlastSendtime = new date(); //削除メッセージの最後の送信時間private date lasttasksendtime = new date(); //保留中のタスクの最後の送信時間プライベートWebSocketsession WebSocketessession; //ユーザーに対応するwssessionは、デフォルトで1つをキャッシュする// getxxとsetxx}最も重要なのはWebSocketsessionプロパティです。
5。WebSocketEndPointの実装
パッケージcn.bridgeli.websocket; import org.slf4j.logger; Import org.slf4j.loggerfactory; Import org.springframework.beans.factory.annotation.autowired; Import org.springframework.web.socket.clestatus org.springframework.web.socket.websocketsession; Import org.springframework.web.socket.handler.textwebsockethandler;/*** @description:websocket processing class*@date:16-3-3*/public class websocketpinop loggerfactory.getLogger(websocketEndpoint.class);@autowiredPrivate NewsListenerimpl NewsListener; @OverRideProtected Void HandleTextMessage(WebSocketSession Session、TextMessage Message)Throws Exception {super.handletextmessage(セッション、メッセージ); server "); session.sendmessage(returnmessage);}/*** @description:接続を確立した後* @param session* @throws exception*/ @overridepublic void afterconnectionStabledished(websocketsession Session)スロー{usersocketvo usersocketvo =(usersocketvo)session。 if(null!= usersocketvo){usersocketvo.setwebsocketsession(session); if(wssessionlocalcache.exists(usersocketvo.getuseremail())){wssessionlocalcache.remove(usersocketvo.getuseremail());} wssessesslocalcache.put(usersocketvo.getuseremail()、 usersocketvo); newsListener.afterConnectionEstabledished(usersocketvo.getuseremail());} logger.info( "ソケットは接続を正常に確立した接続...") (usersocketvo)session.getattributes()。6。wssessionlocalcacheの実装
パッケージcn.bridgeli.websocket; import java.io.serializable; import java.util.arraylist; import java.util.hashmap; import java.util.list; import java.util.util.map;/*** @description:ローカルcche websocketsessions*@date:16-3-3-7*/public cach serializable {private static map <string、usersocketvo> wssessioncache = new hashmap <>(); public static boolean existes(string useremail){if(!wssessioncache.containskey(useremail){return false;} els {return true;}} public static void put(string void put(string void put) usersocketvo){wssessioncache.put(useremail、usersocketvo);} public static usersocketvo get(string useremail){return wssessioncache.get(useremail);} public static void(string useremail){wssessioncache.remove(useremail); arraylist <>(wssessioncache.values());}}その実装を見た後、効果はより明白です。各ユーザーSocketVoの最新データを保存します。実際、私たちのWebSocketの実装はここで計算されていますが、実装されていないコアクラス(ビジネスロジックに関するCharlieのクラス)がまだあります。次の記事であるSpring Integrated WebSocketアプリケーションの例(パート2)では、このクラスの実装方法を確認します。
WebSocketプロトコルの紹介
WebSocketプロトコルは、RFC-6455仕様で定義されたWebフィールドの重要な機能です。つまり、クライアントとサーバーの間の双方向通信です。エキサイティングな機能です。業界は長い間この分野を探求してきました。使用されるテクノロジーには、Javaアプレット、XMLHTTPRequest、Adobe Flash、ActiveXObject、さまざまなコメットテクノロジー、サーバー側の送信イベントなどが含まれます。
WebSocketプロトコルを使用する前に、HTTPプロトコルを使用して最初の握手を構築する必要があることを理解する必要があります。これは、HTTPの確立とプロトコルのアップグレード(またはプロトコル変換)を要求するメカニズムに依存しています。サーバーが同意すると、HTTPステータスコード101に応答し、プロトコルを切り替えることに同意することを示します。 TCPソケットとHTTPプロトコルアップグレード要求を介した握手が成功したと仮定すると、クライアントとサーバーの両方が互いにメッセージを送信できます。
Spring Framework 4.0以降は、新しいモジュール、つまりSpring-Websocketモジュールを導入しました。 WebSocket通信をサポートします。追加の機能を提供しながら、Java WebSocket API仕様JSR-356と互換性があります。
どのシナリオでWebSocketを使用する必要があります
Webアプリケーションでは、クライアントとサーバーがイベントをより高い頻度とより低いレイテンシで交換する必要がある場合、WebSocketに適しています。したがって、WebSocketは、ファイナンス、ゲーム、コラボレーションなどのアプリケーションシナリオに適しています。
他のアプリケーションシナリオには適していない場合があります。たとえば、ニュースサブスクリプションでは、壊れたニュースを表示する必要があります。また、数分間の長いポーリングを使用しても問題ありません。ここでの遅延は許容されます。
低遅延が必要なアプリケーションでも、送信されるメッセージの数が非常に低い場合(ネットワークの障害を監視するなど)、長いポーリング技術を考慮する必要があります。
遅延が低く、高周波メッセージ通信があるシナリオでのみ、WebSocketプロトコルの選択が非常に適しています。このようなアプリケーションシナリオでさえ、WebSocket通信を選択することはまだ可能ですか?または、休憩を選択してくださいhttp通信?
答えは、アプリケーションのニーズに依存するということです。ただし、これら2つのテクノロジーを同時に使用して、頻繁にWebsocketに交換する必要があるデータを配置し、REST APIをプロセスベースのビジネス実装テクノロジーとして使用することもできます。さらに、REST API呼び出しの複数のクライアントに特定の情報をブロードキャストする必要がある場合、WebSocket Connectionを介して実装することもできます。
Springフレームワークでは、@Controller Annotationと@RestController Annotationを提供します。どちらもHTTPリクエストの処理とWebSocketメッセージの処理に使用できます。さらに、Spring MVC要求処理方法、またはその他のアプリケーションリクエスト処理方法は、WebSocketプロトコルを使用して、関心のあるすべてのクライアントまたは指定ユーザーにメッセージをブロードキャストすることができます。