
圖源:《Netty 權威指南(第2版)》。核心流程:Bootstrap 配置 → EventLoopGroup 創建 → Channel 工廠生成 NioSocketChannel → Pipeline 裝配 Handler → 異步 connect → 多路復用器輪詢連接結果 → 成功觸發 Pipeline 執行業務邏輯。
Bootstrap b = new Bootstrap();
客戶端啟動引導類,鏈式 API 配置參數,異步發起連接。
EventLoopGroup group = new NioEventLoopGroup();
NIO 事件循環組,負責 I/O 讀寫、連接處理、定時任務。默認線程數 = CPU 核心數 × 2。
b.group(group)
.channel(NioSocketChannel.class)
.option(ChannelOption.TCP_NODELAY, true);
NioSocketChannel:NIO 非阻塞 Socket 通道TCP_NODELAY:關閉 Nagle 算法,減少小包延遲,適合 RPC 交互b.handler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) {
ch.pipeline().addLast(new HelloClientHandler());
}
});
ChannelInitializer 在 Channel 註冊到 EventLoop 時回調,負責構建 Handler 鏈。
ChannelFuture f = b.connect(host, port).sync();
connect() 返回 ChannelFuture,三種結果:
isSuccess()=trueOP_CONNECT 事件,由 Selector 輪詢結果.sync() 阻塞當前線程直到連接完成(成功或異常)。
OP_CONNECT 就緒CHANNEL_ACTIVE 事件channelActive() → 業務 Handlerpublic class HelloClient {
public void connect(int port, String host) throws Exception {
EventLoopGroup group = new NioEventLoopGroup();
try {
Bootstrap b = new Bootstrap();
b.group(group)
.channel(NioSocketChannel.class)
.option(ChannelOption.TCP_NODELAY, true)
.handler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) {
ch.pipeline().addLast(new HelloClientHandler());
}
});
ChannelFuture f = b.connect(host, port).sync();
f.channel().closeFuture().sync(); // 等待鏈路關閉
} finally {
group.shutdownGracefully(); // 優雅關閉
}
}
public static void main(String[] args) throws Exception {
new HelloClient().connect(8080, "127.0.0.1");
}
}
public class HelloClientHandler extends ChannelHandlerAdapter {
private final ByteBuf message;
public HelloClientHandler() {
byte[] req = "hello Netty".getBytes();
message = Unpooled.buffer(req.length);
message.writeBytes(req);
}
@Override
public void channelActive(ChannelHandlerContext ctx) {
ctx.writeAndFlush(message); // 連接建立即發送
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
ctx.close(); // 異常關閉
}
}

Server 端收到 "hello Netty",雙向通信建立成功。
| 場景 | 建議 |
|---|---|
| 高頻短連接 | 復用 EventLoopGroup,避免頻繁創建/銷毀線程 |
| 長連接心跳 | Pipeline 加入 IdleStateHandler,定時發送心跳檢測存活 |
| 異常重連 | 在 channelInactive 中配合退避策略重連 |
| 優雅關閉 | 調用 group.shutdownGracefully(),等待任務完成 |
| 內存洩漏防護 | ByteBuf 用完必須 release(),或用 SimpleChannelInboundHandler 自動釋放 |