AsyncHttpClient实现Websocket
Contents
1. 简介
AsyncHttpClient (AHC) 是一个基于 Netty 的库,用于轻松执行异步 HTTP 调用并通过 WebSocket 协议进行通信。
在本快速教程中,我们将了解如何启动 WebSocket 连接、发送数据和处理各种控制帧。
2. 设置
该库的最新版本可以在Maven Central 上找到。我们需要小心使用组 id 为 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 和 pong 框架主要用于实现连接的“keep-alive”机制。**我们可以使用*sendPingFrame()和sendPongFrame()*方法发送这些帧:
webSocket.sendPingFrame();
webSocket.sendPongFrame();
关闭现有连接是通过使用*sendCloseFrame()*方法发送关闭帧来完成的,我们可以在其中以文本的形式提供状态码和关闭连接的原因:
webSocket.sendCloseFrame(404, "Forbidden");