WebSockets mit AsyncHttpClient

WebSockets mit AsyncHttpClient

1. Einführung

AsyncHttpClient (AHC) ist eine auf Netty basierende Bibliothek, die erstellt wurde, um auf einfache Weise asynchrone HTTP-Aufrufe auszuführen und über das WebSocket-Protokoll zu kommunizieren.

In diesem kurzen Tutorial erfahren Sie, wie Sie eine WebSocket-Verbindung herstellen, Daten senden und verschiedene Steuerungsrahmen verarbeiten können.

2. Konfiguration

Die neueste Version der Bibliothek finden Sie unterMaven Central. Wir müssen darauf achten, die Abhängigkeit mit der Gruppen-IDorg.asynchttpclient und nicht mitcom.ning: zu verwenden


    org.asynchttpclient
    async-http-client
    2.2.0

3. WebSocket-Client-Konfiguration

Um einen WebSocket-Client zu erstellen, müssen wir zuerst einen HTTP-Client wie inarticlegezeigt erhalten und ihn aktualisieren, um das WebSocket-Protokoll zu unterstützen.

Die Behandlung für das WebSocket-Protokoll-Upgrade erfolgt durch die KlasseWebSocketUpgradeHandler. Diese Klasse implementiert dieAsyncHandler-Schnittstelle und stellt uns auch einen Builder zur Verfügung:

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

Um einWebSocket-Verbindungsobjekt zu erhalten, verwenden wir den StandardAsyncHttpClient, um eine HTTP-Anforderung mit den bevorzugten Verbindungsdetails wie Headern, Abfrageparametern oder Zeitüberschreitungen zu erstellen:

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

4. Daten senden

Verwenden desWebSocket-Objektswe can check whether the connection is successfully opened using the isOpen() method. Sobald wir eine offene Verbindungwe can send data frames with a string or binary payload mit den MethodensendTextFrame() undsendBinaryFrame() haben:

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

5. Handhabung von Kontrollrahmen

Das WebSocket-Protokoll unterstützt drei Arten von Kontrollrahmen: Ping, Pong und Close.

The ping and pong frame are mainly used to implement a “keep-alive” mechanism for the connection. Wir können diese Frames mit den MethodensendPingFrame() undsendPongFrame() senden:

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

Closing the existing connection is done by sending a close frame mit der MethodesendCloseFrame(), bei der wir einen Statuscode und einen Grund für das Schließen der Verbindung in Form eines Textes angeben können:

webSocket.sendCloseFrame(404, "Forbidden");

6. Fazit

Die Unterstützung des WebSocket-Protokolls sowie die einfache Ausführung asynchroner HTTP-Anforderungen machen AHC zu einer sehr leistungsstarken Bibliothek.

Der Quellcode für den Artikel istover on GitHub verfügbar.