WebSockets с AsyncHttpClient

WebSockets с AsyncHttpClient

1. Вступление

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

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

2. Настроить

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


    org.asynchttpclient
    async-http-client
    2.2.0

3. Конфигурация клиента WebSocket

Чтобы создать клиент WebSocket, мы сначала должны получить клиент HTTP, как показано в этомarticle, и обновить его для поддержки протокола 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. Отправка данных

Использование объектаWebSocketwe can check whether the connection is successfully opened using the isOpen() method. Когда у нас есть открытое соединениеwe can send data frames with a string or binary payload с использованием методовsendTextFrame() иsendBinaryFrame():

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

5. Обработка контрольных кадров

Протокол WebSocket поддерживает три типа контрольных фреймов: ping, pong и close.

The ping and pong frame are mainly used to implement a “keep-alive” mechanism for the connection. Мы можем отправить эти кадры, используя методыsendPingFrame() иsendPongFrame():

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

Closing the existing connection is done by sending a close frame с использованием методаsendCloseFrame(), в котором мы можем предоставить код состояния и причину закрытия соединения в виде текста:

webSocket.sendCloseFrame(404, "Forbidden");

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

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

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