WebSockets com AsyncHttpClient

WebSockets com AsyncHttpClient

1. Introdução

O AsyncHttpClient (AHC) é uma biblioteca, baseada no Netty, criada para executar facilmente chamadas HTTP assíncronas e se comunicar através do protocolo WebSocket.

Neste tutorial rápido, veremos como podemos iniciar uma conexão WebSocket, enviar dados e lidar com vários quadros de controle.

2. Configuração

A versão mais recente da biblioteca pode ser encontrada emMaven Central. Precisamos ter cuidado para usar a dependência com o id de grupoorg.asynchttpclient e não comcom.ning:


    org.asynchttpclient
    async-http-client
    2.2.0

3. Configuração do cliente WebSocket

Para criar um cliente WebSocket, primeiro temos que obter um cliente HTTP conforme mostrado nestearticlee atualizá-lo para suportar o protocolo WebSocket.

O tratamento da atualização do protocolo WebSocket é feito pela classeWebSocketUpgradeHandler. Esta classe implementa a interfaceAsyncHandler e também nos fornece um construtor:

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();

Para obter um objeto de conexãoWebSocket, usamos oAsyncHttpClient padrão para criar uma solicitação HTTP com os detalhes de conexão preferidos, como cabeçalhos, parâmetros de consulta ou tempos limite:

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

4. Enviando dados

Usando o objetoWebSocketwe can check whether the connection is successfully opened using the isOpen() method. Assim que tivermos uma conexão abertawe can send data frames with a string or binary payload usando os métodossendTextFrame()esendBinaryFrame():

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

5. Manuseio de quadros de controle

O protocolo WebSocket suporta três tipos de quadros de controle: ping, pong e close.

The ping and pong frame are mainly used to implement a “keep-alive” mechanism for the connection. Podemos enviar esses quadros usando os métodossendPingFrame()esendPongFrame():

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

Closing the existing connection is done by sending a close frame usando o métodosendCloseFrame(), no qual podemos fornecer um código de status e um motivo para fechar a conexão na forma de um texto:

webSocket.sendCloseFrame(404, "Forbidden");

6. Conclusão

O suporte ao protocolo WebSocket, além de oferecer uma maneira fácil de executar solicitações HTTP assíncronas, faz do AHC uma biblioteca muito poderosa.

O código-fonte do artigo está disponívelover on GitHub.