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.