1前書き

HTTP(Hypertext Transfer Protocol)は、ステートレスな要求 – 応答プロトコルです。そのシンプルなデザインは非常にスケーラブルですが非常にインタラクティブでリアルタイムのWebアプリケーションには不適当で非効率的です。

HTTPは同期的であり、リアルタイムアプリケーションは非同期的である必要があるので、ポーリングやロングポーリング(https://en.wikipedia.org/wiki/Comet__(programming)[Comet])のような解決策はいずれも複雑で非効率的です。

上記の問題を解決するには、サーバとクライアントの両方で使用できる標準ベースの双方向全二重プロトコルが必要です。これがhttp://www.oracle.com/の導入につながりました。 technetwork/articles/java/jsr356-1937161.html[JSR 356 API] – この記事では、その使用例を示します。


2セットアップ

Spring WebSocketの依存関係を私たちのプロジェクトに含めてみましょう。

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-websocket</artifactId>
    <version>5.0.5.RELEASE</version>
 </dependency>
 <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-messaging</artifactId>
    <version>5.0.5.RELEASE</version>
 </dependency>


https://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.springframework%22%20AND%20a%3A%22springについては、Maven

Centralから常に依存関係の最新バージョンを入手できます。 -websocket%22[spring-websocket]およびhttps://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.springframework%22%20AND%20a%3A%22spring-messaging%22[春のメッセージ]。


3ストンプ

ストリームテキスト指向メッセージングプロトコル(STOMP)は、クライアントとサーバーがほぼすべてのメッセージブローカーと通信できるようにする、シンプルで相互運用可能なワイヤフォーマットです。これはAMQP(Advanced Message Queuing Protocol)およびJMS(Java Messaging Service)に代わるものです。

STOMPは、クライアント/サーバがメッセージングセマンティクスを使用して通信するためのプロトコルを定義します。セマンティクスはWebSocketsの上にあり、WebSocketsフレームにマップされるフレームを定義します。

STOMPを使用すると、さまざまなプログラミング言語でクライアントとサーバーを開発できる柔軟性が得られます。この例では、クライアントとサーバー間のメッセージングにSTOMPを使用します。


4 WebSocketサーバー

WebSocketサーバーの構築に関する詳細は、このリンクにあります:/websockets-spring[記事]。


5 WebSocketクライアント

WebSocketサーバーと通信するには、クライアントは

Upgrade

ヘッダーを適切に設定してHTTP要求をサーバーに送信することによってWebSocket接続を開始する必要があります。

GET ws://websocket.example.com/HTTP/1.1
Origin: http://example.com
Connection: Upgrade
Host: websocket.example.com
Upgrade: websocket

WebSocketのURLには

ws



wss

のスキームが使われていることに注意してください。2番目のものは安全なWebSocketを表します。

WebSocketsサポートが有効になっている場合、サーバーは応答に

Upgrade

ヘッダーを送信して応答します。

HTTP/1.1 101 WebSocket Protocol Handshake
Date: Wed, 16 Oct 2013 10:07:34 GMT
Connection: Upgrade
Upgrade: WebSocket

このプロセス(WebSocketハンドシェイクとも呼ばれます)が完了すると、最初のHTTP接続は、同じTCP/IP接続の上にあるWebSocket接続に置き換えられ、その後どちらの当事者もデータを共有できます。

このクライアント側接続は

WebSocketStompClient

インスタンスによって開始されます。


5.1.

WebSocketStompClient


セクション3で説明したように、まずWebSocket接続を確立する必要があります。これは

WebSocketClient

クラスを使用して行います。


WebSocketClient

は、次のように設定できます。


  • StandardWebSocketClient

    は、のような任意のJSR-356実装によって提供されます

タイラス
**

JettyWebSocketClient

はJetty 9ネイティブWebSocket APIによって提供されています

  • Springの

    WebSocketClient

    の任意の実装

この例では、

WebSocketClient

の実装である

StandardWebSocketClient

を使います。

WebSocketClient client = new StandardWebSocketClient();

WebSocketStompClient stompClient = new WebSocketStompClient(client);
stompClient.setMessageConverter(new MappingJackson2MessageConverter());

StompSessionHandler sessionHandler = new MyStompSessionHandler();
stompClient.connect(URL, sessionHandler);

new Scanner(System.in).nextLine();//Don't close immediately.

デフォルトでは、

WebSocketStompClient



SimpleMessageConverter

をサポートしています。

JSONメッセージを扱っているので、JSONペイロードをオブジェクトに変換するためにメッセージコンバータを

MappingJackson2MessageConverter

に設定します。

エンドポイントへの接続中に、

afterConnected



handleFrame

などのイベントを処理する

StompSessionHandler

のインスタンスを渡します。

サーバーにSockJがサポートされている場合は、http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#websocket-fallback-sockjs-client[

SockJsClient

]を使用するようにクライアントを変更できます。

StandardWebSocketClient.

ではなく


5.2.

StompSessionHandler


WebSocketトピックを購読するには、

StompSession

を使用できます。これは、

StompSessionHandlerAdapter

のインスタンスを作成することによって実行できます。このインスタンスは

StompSessionHandler

を実装しています。


StompSessionHandler

は、STOMPセッションのライフサイクルイベントを提供します。

イベントには、セッションが確立されたときのコールバック、および失敗時の通知が含まれます。

WebSocketクライアントがエンドポイントに接続するとすぐに

StompSessionHandler

が通知され、

afterConnected()

メソッドが呼び出されます。ここでは、

StompSession

を使用してトピックにサブスクライブします。

@Override
public void afterConnected(
  StompSession session, StompHeaders connectedHeaders) {
    session.subscribe("/topic/messages", this);
    session.send("/app/chat", getSampleMessage());
}
@Override
public void handleFrame(StompHeaders headers, Object payload) {
    Message msg = (Message) payload;
    logger.info("Received : " + msg.getText()+ " from : " + msg.getFrom());
}

WebSocketサーバーが実行中でクライアントを実行中であることを確認してください。メッセージがコンソールに表示されます。

INFO o.b.w.client.MyStompSessionHandler - New session established : 53b993eb-7ad6-4470-dd80-c4cfdab7f2ba
INFO o.b.w.client.MyStompSessionHandler - Subscribed to/topic/messages
INFO o.b.w.client.MyStompSessionHandler - Message sent to websocket server
INFO o.b.w.client.MyStompSessionHandler - Received : Howdy!! from : Nicky


6. 結論

このクイックチュートリアルでは、SpringベースのWebSocketクライアントを実装しました。

完全な実装はhttps://github.com/eugenp/tutorials/tree/master/spring-boot-client[over on GitHub]にあります。