WebSockets avec AsyncHttpClient

WebSockets avec AsyncHttpClient

1. introduction

AsyncHttpClient (AHC) est une bibliothèque basée sur Netty, créée pour exécuter facilement des appels HTTP asynchrones et communiquer via le protocole WebSocket.

Dans ce rapide didacticiel, nous allons voir comment démarrer une connexion WebSocket, envoyer des données et gérer divers cadres de contrôle.

2. Installer

La dernière version de la bibliothèque est disponible surMaven Central. Nous devons faire attention à utiliser la dépendance avec l'id de groupeorg.asynchttpclient et non celle aveccom.ning:


    org.asynchttpclient
    async-http-client
    2.2.0

3. Configuration du client WebSocket

Pour créer un client WebSocket, nous devons d'abord obtenir un client HTTP comme indiqué dans cearticle et le mettre à niveau pour prendre en charge le protocole WebSocket.

La gestion de la mise à niveau du protocole WebSocket est effectuée par la classeWebSocketUpgradeHandler. Cette classe implémente l'interfaceAsyncHandler et nous fournit également un constructeur:

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

Pour obtenir un objet de connexionWebSocket, nous utilisons le standardAsyncHttpClient pour créer une requête HTTP avec les détails de connexion préférés, comme les en-têtes, les paramètres de requête ou les délais d'expiration:

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

4. Envoi de données

Utilisation de l'objetWebSocketwe can check whether the connection is successfully opened using the isOpen() method. Une fois que nous avons une connexion ouvertewe can send data frames with a string or binary payload en utilisant les méthodessendTextFrame() etsendBinaryFrame():

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

5. Manipulation des cadres de contrôle

Le protocole WebSocket prend en charge trois types de trames de contrôle: ping, pong et close.

The ping and pong frame are mainly used to implement a “keep-alive” mechanism for the connection. Nous pouvons envoyer ces trames en utilisant les méthodessendPingFrame() etsendPongFrame():

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

Closing the existing connection is done by sending a close frame en utilisant la méthodesendCloseFrame(), dans laquelle nous pouvons fournir un code de statut et une raison pour fermer la connexion sous la forme d'un texte:

webSocket.sendCloseFrame(404, "Forbidden");

6. Conclusion

La prise en charge du protocole WebSocket, outre le fait qu’il offre un moyen simple d’exécuter des requêtes HTTP asynchrones, fait d’AHC une bibliothèque très puissante.

Le code source de l'article est disponibleover on GitHub.