AsyncHttpClientを使用したWebソケット

AsyncHttpClientを使用したWebSocket

1. 前書き

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

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

2. セットアップ

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


    org.asynchttpclient
    async-http-client
    2.2.0

3. WebSocketクライアント設定

WebSocketクライアントを作成するには、最初にこのarticleに示されている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オブジェクトwe can check whether the connection is successfully opened using the isOpen() methodを使用します。 sendTextFrame()およびsendBinaryFrame()メソッドを使用してwe can send data frames with a string or binary payloadの接続を開くと、次のようになります。

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

5. コントロールフレームの処理

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

The ping and pong frame are mainly used to implement a “keep-alive” mechanism for the connection.sendPingFrame()およびsendPongFrame()メソッドを使用してこれらのフレームを送信できます。

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

sendCloseFrame()メソッドを使用するClosing the existing connection is done by sending a close frame。このメソッドでは、ステータスコードと接続を閉じる理由をテキスト形式で提供できます。

webSocket.sendCloseFrame(404, "Forbidden");

6. 結論

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

記事のソースコードはover on GitHubで入手できます。