发布于2026-07-08 阅读(0)
扫一扫,手机访问
异步非阻塞 IO(AIO)中的“乒乓”模式,实际体现为“one request, one response”的轻量交互节奏,表现为读完立即写、写完继续读的链式异步回调,全程无阻塞、无轮询、不依赖线程绑定。

这种模式的核心并非指数据在两端来回弹跳,而是强调在完全不阻塞主线程、无需轮询、不依赖线程绑定的前提下,像打乒乓球一样自然衔接:客户端发起一次请求,服务端立刻响应;客户端再发起,服务端再响应——整个流程由内核通知驱动,用户线程只需负责注册和回调,不等待、不查状态、不空转。
说白了,它就是典型的“一问一答”风格,但底层完全脱离了 BIO 的线程 per connection 和 NIO 的 Selector 轮询。关键特征有几个:
在 Ja va AIO(NIO.2)中,真正支撑该模式的是三个协作对象:
举个例子,在 read 完成的回调里,解析 buffer 内容后,直接调用 channel.write(buffer, null, writeHandler),写完后又回到 read——这就形成了一个闭环,代码层面就是“乒乓”的形态。
下面给出服务端的关键逻辑(省略了异常处理和资源关闭):
AsyncEchoHandler.ja va
public class AsyncEchoHandler implements CompletionHandler {
private final AsynchronousSocketChannel channel;
private final ByteBuffer buffer = ByteBuffer.allocate(1024);
public AsyncEchoHandler(AsynchronousSocketChannel channel) {
this.channel = channel;
}
@Override
public void completed(Integer bytesRead, ByteBuffer attachment) {
if (bytesRead == -1) { // 对端关闭
closeQuietly();
return;
}
buffer.flip();
byte[] data = new byte[buffer.remaining()];
buffer.get(data);
System.out.println("收到:" + new String(data).trim());
buffer.clear();
// 立即回显 —— 异步写出
ByteBuffer echoBuf = ByteBuffer.wrap(("ECHO: " + new String(data)).getBytes());
channel.write(echoBuf, echoBuf, new WriteHandler(channel));
}
@Override
public void failed(Throwable exc, ByteBuffer attachment) {
closeQuietly();
}
private void closeQuietly() {
try { channel.close(); } catch (IOException ignored) {}
}
}
需要特别注意:每次 read 完成后,不会用 while 循环再次读取,而是通过再次调用 channel.read(buffer, buffer, this) 发起下一轮异步读——这才是维持“乒乓”节奏的关键动作,它让连接始终处于“等待下一次 ping”的状态。
客户端也应当使用 AIO 的 AsynchronousSocketChannel,避免阻塞 recv。典型的做法是:
这样一来,单个客户端线程就能驱动多个连接持续“发→等→收→发”,而服务端同样可以用少量线程支撑海量连接,这才真正发挥出 AIO 的伸缩优势。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8