1. 简介
AsyncHttpClient (AHC) 是一个基于Netty的库,专为简化异步HTTP调用和WebSocket协议通信而设计。本文将快速介绍如何建立WebSocket连接、发送数据以及处理各类控制帧。
2. 环境配置
最新版库文件可在Maven中央仓库获取。⚠️ 注意:务必使用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。
协议升级通过WebSocketUpgradeHandler
类实现,该类实现了AsyncHandler
接口并提供构建器:
WebSocketUpgradeHandler.Builder upgradeHandlerBuilder
= new WebSocketUpgradeHandler.Builder();
WebSocketUpgradeHandler wsHandler = upgradeHandlerBuilder
.addWebSocketListener(new WebSocketListener() {
@Override
public void onOpen(WebSocket websocket) {
// WebSocket连接已建立
}
@Override
public void onClose(WebSocket websocket, int code, String reason) {
// WebSocket连接已关闭
}
@Override
public void onError(Throwable t) {
// WebSocket连接出错
}
}).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帧主要用于实现连接保活机制。 通过以下方法发送:
webSocket.sendPingFrame();
webSocket.sendPongFrame();
关闭连接需发送close帧,可附带状态码和关闭原因文本:
webSocket.sendCloseFrame(404, "Forbidden");
6. 总结
AHC不仅提供简洁的异步HTTP请求方案,其WebSocket协议支持更使其成为强大的网络通信库。本文源码可在GitHub获取。