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获取。


原始标题:WebSockets with AsyncHttpClient