Spring WebSocket


卒業プロジェクトでは、スプリングを使ったWebソケットを使い、何日もレポートを探しましたが、理解できるようですが、理解できませんでした.
MVCもよく理解できなかったのに、Webソケットだったなんて...それも頭突きで片付けましょう

WebSocketとは?


Webソケットとは、TCP接続のための全二重通信チャネル(双方向通信チャネル)を提供するコンピュータ通信プロトコルである.
RFC 6455リストに定義されたプロトコルWeb Socketは、サーバとブラウザとの間で接続を維持しながらデータを交換することを可能にする.この場合、データは「パケット」の形で伝達され、伝送は双方向であり、接続と追加のHTTP要求を中断する必要はない.
これらの特徴により、Webソケットは、オンラインゲームや株式取引システムなどのデータ交換を継続する必要があるサービスに非常に適している.

せつぞくこうぞう


では、Webソケット接続の仕組みを見てみましょう.

HTTP通信で握手し,プロトコルをWSに変換し,Webソケットフレームを介してデータを転送する.全二重通信チャネルが使用されるため、要求と応答は区別されない.終了時にclose handshake終了が送信されます.
クライアントのリクエストとサーバの応答を見てみましょう.

クライアント要求

GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com
これにより、HTTPの使用方法をWebSocketに変更したコンテンツをConnectionとUpgradeで送信します.
サーバは、Sec-WebSocket-Protocolのプロトコルを選択して使用する.

サーバレスポンス

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat
次の通信からWebソケットで通信できるようになりました.チャットプロトコルが選択されていることがわかります.

Webソケットはブラウザのサポートが必要ですが、サポートされていないブラウザもあります.Webソケット通信を使用するように、sockJSを使用してこれらのブラウザをサポートします.

SockJS


WebSocket APIを使用するアプリケーションでは、ブラウザがWebSocketをサポートしない場合があります.
このとき、実行時にWebSocketをHTTPベースの他の技術(例えばHTTP StreamingまたはLong-Polling)に変換し、再接続を試みるWebSocketシミュレーションがSockJSである.
これらを先に知っておけばいいので、詳しい内容は正式な書類を参考にすると役に立つはずです.

STOMP


STOMPは、単純なテキスト向けのメッセージプロトコルの略であり、双方向ネットワークプロトコルに基づいている.Webソケットは、2種類のメッセージを定義しますが、その内容は定義されていません.STOMPプロトコルは、このWebソケットの上で実行されるプロトコルであり、クライアントとサーバが送信するメッセージのタイプ、フォーマット、コンテンツを定義するメカニズムです.
メッセージ・ヘッダの値に基づいて認証処理を実現するために、メッセージ・ヘッダに値を指定できます.定義されたルールを遵守する場合、複数の言語とプラットフォームにわたってメッセージ相互運用を行うことができます.
さらに、重要な点は、Publisher-Subscribe機構を提供することである.デフォルトでは、スプリングアプリケーションはSTOMP Brokerを使用し、RabbitMQまたはActiveMQなどの外部メッセージングシステムをBrokerとしてサポートします.
この場合,外部エージェントはスプリングとクライアントとの間の媒介として,スプリングとエージェントはTCP接続を保持する.
スプリングによってエージェントにメッセージを渡し、エージェントによってクライアントにメッセージを渡す構造.Springは、上記の構成により、HTTPベースのセキュリティ設定や汎用検証などを適用することができる.
STOMP実装体に文字列構文に従って直接意味を付与させるために,設計情報は明確に定義されていない.しかし、一般的には、/topic文字列の先頭のフレーズは1対1のpub/subを表し、/queue文字列の先頭のフレーズは1対1のメッセージ交換を表す.
今になってやっと少し分かった.
サンプルコードでもう一度分析します.

Reference


開発したキバノロ
高勝彬
ブログ
Spring Docs