1. 序章

AsyncHttpClient(AHC)は、Nettyに基づくライブラリであり、非同期HTTP呼び出しを簡単に実行し、WebSocketプロトコルを介して通信するために作成されています。

このクイックチュートリアルでは、WebSocket接続を開始し、データを送信し、さまざまな制御フレームを処理する方法を説明します。

2. 設定

ライブラリの最新バージョンは、 MavenCentralにあります。 com.ning:の依存関係ではなく、グループID org.asynchttpclientの依存関係を使用するように注意する必要があります。

<dependency>
    <groupId>org.asynchttpclient</groupId>
    <artifactId>async-http-client</artifactId>
    <version>2.2.0</version>
</dependency>

3. WebSocketクライアントの構成

WebSocketクライアントを作成するには、まず、この記事に示されているHTTPクライアントを取得し、WebSocketプロトコルをサポートするようにアップグレードする必要があります。

WebSocketプロトコルのアップグレードの処理は、WebSocketUpgradeHandlerクラスによって行われます。 このクラスは、 AsyncHandler インターフェースを実装し、ビルダーも提供します。

WebSocketUpgradeHandler.Builder upgradeHandlerBuilder
  = new WebSocketUpgradeHandler.Builder();
WebSocketUpgradeHandler wsHandler = upgradeHandlerBuilder
  .addWebSocketListener(new WebSocketListener() {
      @Override
      public void onOpen(WebSocket websocket) {
          // WebSocket connection opened
      }

      @Override
      public void onClose(WebSocket websocket, int code, String reason) {
          // WebSocket connection closed
      }

      @Override
      public void onError(Throwable t) {
          // WebSocket connection error
      }
  }).build();

WebSocket 接続オブジェクトを取得するには、標準の AsyncHttpClient を使用して、ヘッダー、クエリパラメーター、タイムアウトなどの優先接続の詳細を含むHTTPリクエストを作成します。

WebSocket webSocketClient = Dsl.asyncHttpClient()
  .prepareGet("ws://localhost:5590/websocket")
  .addHeader("header_name", "header_value")
  .addQueryParam("key", "value")
  .setRequestTimeout(5000)
  .execute(wsHandler)
  .get();

4. データの送信

WebSocket オブジェクトを使用して、isOpen()メソッドを使用して接続が正常に開かれたかどうかを確認できます。 接続が開いたら sendTextFrame()および sendBinaryFrame()メソッドを使用して、文字列またはバイナリペイロードでデータフレームを送信できます。

if (webSocket.isOpen()) {
    webSocket.sendTextFrame("test message");
    webSocket.sendBinaryFrame(new byte[]{'t', 'e', 's', 't'});
}

5. コントロールフレームの取り扱い

WebSocketプロトコルは、ping、pong、およびcloseの3種類の制御フレームをサポートします。

pingおよびpongフレームは、主に接続の「キープアライブ」メカニズムを実装するために使用されます。 sendPingFrame()および sendPongFrame()を使用してこれらのフレームを送信できます。 メソッド:

webSocket.sendPingFrame();
webSocket.sendPongFrame();

既存の接続を閉じるには、 sendCloseFrame()メソッドを使用してクローズフレームを送信します。このメソッドでは、ステータスコードと接続を閉じる理由を次の形式で提供できます。文章:

webSocket.sendCloseFrame(404, "Forbidden");

6. 結論

WebSocketプロトコルをサポートしていることは、非同期HTTP要求を実行する簡単な方法を提供するという事実に加えて、AHCを非常に強力なライブラリにします。

この記事のソースコードは、GitHubから入手できます。