«1. Введение

AsyncHttpClient (AHC) — это библиотека на основе Netty, созданная для простого выполнения асинхронных вызовов HTTP и обмена данными по протоколу WebSocket.

В этом кратком руководстве мы увидим, как мы можем запускать соединение WebSocket, отправлять данные и обрабатывать различные кадры управления.

2. Установка

Последнюю версию библиотеки можно найти на Maven Central. Мы должны быть осторожны, чтобы использовать зависимость с идентификатором группы org.asynchttpclient, а не с com.ning:

<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 в основном используется для реализации механизма «keep-alive» для соединения. Мы можем отправить эти фреймы, используя методы sendPingFrame() и sendPongFrame(): причина закрытия соединения в виде текста:

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

6. Заключение

webSocket.sendCloseFrame(404, "Forbidden");

Наличие поддержки протокола WebSocket, помимо того, что он обеспечивает простой способ выполнения асинхронных HTTP-запросов, делает AHC очень мощная библиотека.

Исходный код статьи доступен на GitHub.

«