ホームページ > 記事 > ウェブフロントエンド > Spring WebSocket の詳細な紹介
Websocket は、HTML5 の新機能の 1 つで、ブラウザとサーバー間の全二重通信方式を確立し、http リクエストとレスポンスによる過剰なリソース消費を解決することを目的としています。チャット、株取引、ゲームなど、高いリアルタイム性が求められる特殊なシナリオの実装方法に新しいソリューションを提供します。
Comet はブラウザの http を介して一方向通信のみを実現できますが、効率は低く、サーバーからの適切なサポートが必要です。 flash 本物の双方向通信を実現できます。 flex ajax ブリッジを介して、これら 2 つの機能を javascript で使用できます。websocket がブラウザに実装されれば、上記 2 つのテクノロジーに代わって広く使用されることが予想されます。このような状況に直面して、HTML5 では WebSocket プロトコルを定義しています。これにより、サーバーのリソースと帯域幅を節約し、リアルタイム通信を実現できます。現在、主要な主流ブラウザはすべて WebSocket をサポートしています。IE ブラウザ には IE10+ が必要です
POM 依存関係、spring4.1.4.RELEASE、以下は WebSocket 関連の jar です
<dependency> <groupId>javax.websocket</groupId> <artifactId>javax.websocket-api</artifactId> <version>1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-websocket</artifactId> <version>4.1.4.RELEASE</version> </dependency>です。
@Configuration @EnableWebMvc @EnableWebSocket public class WebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { //允许连接的域,只能以http或https开头 String[] allowsOrigins = {"http://www.xxx.com"}; //WebIM WebSocket通道 registry.addHandler(chatWebSocketHandler(),"/ webSocketIMServer").setAllowedOrigins(allowsOrigins).addInterceptors(myInterceptor()); registry.addHandler(chatWebSocketHandler(), "/sockjs/w ebSocketIMServer").setAllowedOrigins(allowsOrigins).addInterceptors(myInterceptor()).withSockJS(); } @Bean public ChatWebSocketHandler chatWebSocketHandler() { return new ChatWebSocketHandler(); } @Bean public WebSocketHandshakeInterceptor myInterceptor(){ return new WebSocketHandshakeInterceptor(); } }
WebSocketConfigurer インターフェイスを実装し、 registerWebSocketHandlers メソッドをオーバーライドします。これは、WebSocket 入口、許可されたアクセス ドメイン、登録済みハンドラー、SockJ サポートおよびインターセプターを構成するコア実装メソッドです。
registry.addHandler には登録機能とルーティング機能があり、クライアントが WebSocket 接続を開始すると、/path は特定のビジネス ロジックを実装せずに、対応するハンドラーに渡されて処理されます。これは、収集およびタスク配布センターとして理解できます。
setAllowedOrigins(String[] Domains) は、指定したドメイン名または IP (ポート番号を含む) で長い接続を確立できるようにします。自分のドメイン名へのアクセスのみを許可する場合は、ここで簡単に設定できます。 「*」記号を期限なしで使用する場合、ドメイン名を指定する場合は、http または https で始める必要があります。
addInterceptors は、名前が示すように、ハンドラーを呼び出す前と後に独自のロジック コードをハンドラーに追加します。
spring websocket も STOMP プロトコルをサポートしています。それについては次回共有します。
public class WebSocketHandshakeInterceptor implements HandshakeInterceptor { @Override public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object > attributes) throws Exception { if (request instanceof ServletServerHttpRequest) { attributes.put("username",userName); } return true; } @Override public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) { } }
beforeHandshake、ハンドラーを呼び出す前の処理メソッド。ハンドラー内でユーザー情報を登録し、WebSocketSessionをバインドし、ユーザー情報に基づいてWebSocketSessionを取得してメッセージを送信するためによく使用されます。
public class ChatWebSocketHandler extends TextWebSocketHandler{ private final static List<WebSocketSession> sessions = Collections.synchronizedList(new ArrayList<WebSocketSession>()); //接收文本消息,并发送出去 @Override protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { chatTextMessageHandler(message.getPayload()); super.handleTextMessage(session, message); } //连接建立后处理 @SuppressWarnings("unchecked") @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { logger.debug("connect to the websocket chat success......"); sessions.add(session); //处理离线消息 } //抛出异常时处理 @Override public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { if(session.isOpen()){ session.close(); } logger.debug("websocket chat connection closed......"); sessions.remove(session); } //连接关闭后处理 @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception { logger.debug("websocket chat connection closed......"); sessions.remove(session); } @Override public boolean supportsPartialMessages() { return false; } }
var host = window.location.host; var websocket; if ('WebSocket' in window) { websocket = new ReconnectingWebSocket("ws://" + host + "/webSocketIMServer", null, {debug:true, maxReconnectAttempts:4}); } else if ('MozWebSocket' in window) { websocket = new MozWebSocket("ws://" + host + "/webSocketIMServer"); } else { websocket = new SockJS("http://" + host + "/sockjs/webSocketIMServer"); } websocket.onopen = function(evnt) { console.log("websocket连接上"); }; websocket.onmessage = function(evnt) { messageHandler(evnt.data); }; websocket.onerror = function(evnt) { console.log("websocket错误"); }; websocket.onclose = function(evnt) { console.log("websocket关闭"); }
ここではWebSocket.jsを使用し、再接続、接続タイムアウト、再接続失敗間隔、接続試行などの拡張機能を追加します。時間など
プロジェクトホームページ:WebSocketの再接続
以上がSpring WebSocket の詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。