Netty 入门:Java 实现高性能 TCP 服务器

Netty 是基于 Java NIO 的异步事件驱动框架,特别适合构建高性能 TCP 服务器。以下是实现核心步骤和代码示例:

1. 核心组件
  • EventLoopGroup:处理 I/O 操作的多线程事件循环
    • bossGroup:接受客户端连接
    • workerGroup:处理连接的数据读写
  • ServerBootstrap:服务器启动引导类
  • ChannelInitializer:初始化通道处理器
  • 自定义处理器:继承 ChannelInboundHandlerAdapter
2. 完整代码实现
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;

public class NettyTcpServer {
    private final int port;
    
    public NettyTcpServer(int port) {
        this.port = port;
    }
    
    public void run() throws Exception {
        EventLoopGroup bossGroup = new NioEventLoopGroup();
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        
        try {
            ServerBootstrap bootstrap = new ServerBootstrap();
            bootstrap.group(bossGroup, workerGroup)
                     .channel(NioServerSocketChannel.class)
                     .childHandler(new ChannelInitializer<SocketChannel>() {
                         @Override
                         protected void initChannel(SocketChannel ch) {
                             ch.pipeline().addLast(new TcpServerHandler());
                         }
                     })
                     .option(ChannelOption.SO_BACKLOG, 128)
                     .childOption(ChannelOption.SO_KEEPALIVE, true);
            
            // 绑定端口并启动
            ChannelFuture future = bootstrap.bind(port).sync();
            System.out.println("服务器启动,监听端口: " + port);
            
            // 等待服务器关闭
            future.channel().closeFuture().sync();
        } finally {
            workerGroup.shutdownGracefully();
            bossGroup.shutdownGracefully();
        }
    }
    
    // 自定义业务处理器
    private static class TcpServerHandler extends ChannelInboundHandlerAdapter {
        @Override
        public void channelRead(ChannelHandlerContext ctx, Object msg) {
            // 处理接收到的数据(示例:原样返回)
            ctx.write(msg);  // 写入缓冲区
            ctx.flush();     // 立即刷新发送
        }
        
        @Override
        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
            cause.printStackTrace();
            ctx.close();
        }
    }
    
    public static void main(String[] args) throws Exception {
        new NettyTcpServer(8080).run();  // 启动8080端口服务
    }
}

3. 性能优化关键点
  • 线程模型:使用 NioEventLoopGroup 非阻塞 I/O
  • 零拷贝:通过 FileRegion 支持文件传输
  • 内存管理:使用池化的 ByteBuf 减少 GC
  • 背压控制:配置 ChannelOption.WRITE_BUFFER_WATER_MARK 防止 OOM
  • 连接复用:开启 SO_REUSEADDR 选项
4. 测试方法

使用 telnetnc 命令测试:

telnet localhost 8080
> Hello Netty   # 发送消息
Hello Netty     # 服务器原样返回

5. 性能对比
指标 传统 BIO Netty
连接数上限 ~1,000 >10,000
吞吐量 高 (可达 10Gbps)
CPU 利用率 30%-50% >90%
内存占用 低 (池化缓冲)

提示:实际项目中需添加编解码器(如 StringEncoder/StringDecoder)和业务逻辑处理器,并配置 SSL/TLS 实现安全通信。

通过 Netty 的 Reactor 线程模型和零拷贝技术,可轻松实现单机百万级并发连接,适合物联网、金融交易等高性能场景。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐