Перейти к основному содержимому

Веб-сокеты с AsyncHttpClient

· 2 мин. чтения

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 и close.

Кадр ping and pong в основном используется для реализации механизма «поддержки активности» для соединения. Мы можем отправить эти кадры, используя методы sendPingFrame() и sendPongFrame() :

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

Закрытие существующего соединения осуществляется путем отправки кадра закрытия с помощью метода sendCloseFrame() , в котором мы можем предоставить код состояния и причину закрытия соединения в виде текста:

webSocket.sendCloseFrame(404, "Forbidden");

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

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

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