WebSocketは、単一のTCP接続を使用して、クライアントとサーバー間の双方向通信を提供します。
プロトコルは2つのフェーズで構成されます。
ハンドシェイク要求の場合、HTTP GET要求が使用され、その結果、接続がWebSocketに更新されます。
この記事では、クライアントとサーバー間の接続を確立し、WebSocketへの接続をポンプし、Springアプリケーションでメッセージを転送するメカニズムを詳細に調べます。
解析では、Spring-WebSocketおよびAnnotationベースの構成を使用します。
構成クラスの作成
したがって、最初に、接続を作成してデータを送信するためにクライアントがアクセスするアクセスポイントを宣言する必要があります。
構成クラスでWebSocketを使用するには、@ EnableWebSocketアノテーションを使用する必要があります。 このアノテーションの説明から、構成クラスによってWebSocketConfigurerインターフェースを実装する必要があります。 WebSocketConfigurerインターフェイスには、1つのregisterWebSocketHandlers(WebSocketHandlerRegistryレジストリ)メソッドが含まれています 。 入力パラメーターWebSocketHandlerRegistryを使用して、特定のURLに着信メッセージのハンドラー(WebSocketHandler)を追加します。
@EnableWebSocketアノテーションの操作をより詳細に検討してください。
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Documented @Import(DelegatingWebSocketConfiguration.class) public @interface EnableWebSocket { }
このアノテーションの主なタスクは、DelegatingWebSocketConfiguration構成クラスをインポートすることです。このクラスは、@ Autowiredを使用してWebSocketConfigurerインターフェイス(構成クラス)のインスタンスを受け取ります。 これらのWebSocketConfigurerインスタンスは、HandlerMapping Beanを作成するために親WebSocketConfigurationSupportクラスで使用されます。
HandlerMapping Beanの作成は、後でDispatcherServletがこのURLのハンドラーを決定できるようにするために必要です。
WebSocketHandlerをHandlerMappingのインスタンスに変換するには、WebSocketHttpRequestHandlerおよびWebSocketHandlerMappingアダプターが必要です。
WebSocketHttpRequestHandlerを使用して、WebSocketHandlerをHttpRequestHandlerにキャストします。 次に、WebSocketを開く要求を待っているURLバンドルとHttpRequestHandlerを使用して、WebSocketHandlerMappingのインスタンスを作成します。これは、HTTP要求を処理するためにDispatcherServletに登録されます。
クライアントがWebSocket接続を開く要求を送信すると、DispatcherServletを介した要求は 、WebSocketHttpRequestHandlerデコレーターのhandleRequest(HttpServletRequest servletRequest、HttpServletResponse servletResponse)メソッドに送られます。
このメソッドは、WebSocketHandlersを定義するときに構成クラスで宣言されているインターセプターを呼び出し、HandshakeHandlerのデフォルトまたはカスタムインスタンスであるdoHandshakeメソッドを呼び出します。
ハンドシェイク要求処理
doHandshakeメソッドの動作について詳しく説明します。 これは、接続をWebSocketsに変換するすべての魔法が発生する場所です。 しかし、最初に、ユーザー要求とサーバー応答のパラメーターを見てみましょう。
ユーザーリクエストの典型的な例は次のとおりです。
GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Origin: http://example.com Sec-WebSocket-Protocol: chat, superchat Sec-WebSocket-Version: 13 Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
- Origin-リクエストの発信元のURLが含まれます。 有効なアドレスを確認するために使用されます。
- Sec-WebSocket-Protocol-STOMPなどのサブプロトコルのセットを定義します。これについては、以降の記事で説明します。
- Sec-WebSocket-Key-ブラウザーによって生成されるランダムなキー:Base64エンコードの16バイト。
- Sec-WebSocket-Version-プロトコルバージョン。
- Sec-WebSocket-Extensions-追加の拡張機能、たとえばpermessage-deflateは、メッセージが圧縮形式で送信されることを意味します。
サーバーからの典型的な応答:
HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
HTTP 101応答コードは、WebSocketへのプロトコルスイッチを示します。
Sec-WebSocket-Accept-送信されたSec-WebSocket-Keyと定数「258EAFA5-E914-47DA-95CA-C5AB0DC85B11」に基づいて計算された値-これは基本的に、サーバーからWebSocket接続を開始する準備ができていることの確認です。
doHandshakeメソッドの操作は、次のように概略的に表すことができます。
WebSocketへのリクエストを更新するための戦略
現在、接続更新戦略が利用可能です。
- TomcatRequestUpgradeStrategy
- JettyRequestUpgradeStrategy
- UndertowRequestUpgradeStrategy
- GlassFishRequestUpgradeStrategy
- WebLogicRequestUpgradeStrategy
- WebSphereRequestUpgradeStrategy
戦略の更新プロセスは、次の手順で構成されます。
* EndPointの継承者であるStandardWebSocketHandlerAdapterでWebSocketHandlerをラップすることにより、EndPointインスタンスが作成されます。 セッションを作成するには、StandardWebSocketSessionを使用します。
** HttpServletRequestを更新するには、この更新インターフェイスの標準メソッドが使用され、HttpUpgradeHandlerの実装が渡されます。
Tomcatで作業する場合は、WsHttpUpgradeHandlerです。 HttpUpgradeHandlerのインスタンスが初期化されると、EndPonitが作成され、WebSocketContainerに登録されます。
これらの設定後、WebSocketHandler実装は着信メッセージを受信する準備ができており、WebSocketSessionを使用してクライアントにメッセージを送信する機会があります。
ご清聴ありがとうございました。 次の記事では、フォールバックメカニズムがSockJSでどのように機能するか、およびSTOMPサブプロトコルの可能性について説明します。
使用されるソース:
→ WebSocketプロトコル
→ Spring WebSocket