初始化Netty服务端步骤
- 创建ServerBootstrap对象:用于配置和启动NIO服务端。
ServerBootstrap serverBootstrap = new ServerBootstrap();
- 设置线程模型:使用
group
方法设置主从线程组,主Reactor线程组负责接收客户端连接,从Reactor线程组负责处理I/O读写。
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
serverBootstrap.group(bossGroup, workerGroup);
- 设置通道类型:使用
channel
方法指定NIO通道类型,如NioServerSocketChannel
。
serverBootstrap.channel(NioServerSocketChannel.class);
- 设置通道参数:例如设置
SO_BACKLOG
参数,用于设置TCP连接队列长度。
serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024);
- 添加处理器:通过
childHandler
方法添加ChannelInitializer
,用于初始化每个新连接的通道。在ChannelInitializer
中添加编解码器和业务处理器。
serverBootstrap.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(new StringEncoder());
ch.pipeline().addLast(new StringDecoder());
ch.pipeline().addLast(new ServerHandler());
}
});
- 绑定端口并启动服务端:使用
bind
方法绑定指定端口。
ChannelFuture future = serverBootstrap.bind(port).sync();
future.channel().closeFuture().sync();
初始化Netty客户端步骤
- 创建Bootstrap对象:用于配置和启动NIO客户端。
Bootstrap bootstrap = new Bootstrap();
- 设置线程模型:使用
group
方法设置EventLoopGroup,负责处理客户端I/O操作。
EventLoopGroup group = new NioEventLoopGroup();
bootstrap.group(group);
- 设置通道类型:使用
channel
方法指定NIO通道类型,如NioSocketChannel
。
bootstrap.channel(NioSocketChannel.class);
- 设置通道参数:例如设置
SO_KEEPALIVE
参数,用于保持连接存活。
bootstrap.option(ChannelOption.SO_KEEPALIVE, true);
- 添加处理器:通过
handler
方法添加ChannelInitializer
,用于初始化通道。在ChannelInitializer
中添加编解码器和业务处理器。
bootstrap.handler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(new StringEncoder());
ch.pipeline().addLast(new StringDecoder());
ch.pipeline().addLast(new ClientHandler());
}
});
- 连接服务端:使用
connect
方法连接到服务端指定地址和端口。
ChannelFuture future = bootstrap.connect(host, port).sync();
future.channel().closeFuture().sync();
消息编解码方式选择
- 字符串编解码:
- StringEncoder:将Java字符串编码为字节数组发送。
- StringDecoder:将接收到的字节数组解码为Java字符串。适用于简单文本消息通信。
- 对象编解码:
- Java序列化:使用Java自带的
ObjectOutputStream
和ObjectInputStream
进行对象的序列化和反序列化,但效率较低,且存在兼容性问题。
- Protobuf:Google开发的高效序列化框架,通过定义.proto文件生成Java代码,具有体积小、速度快、兼容性好等优点,适用于高性能分布式系统。
- JSON编解码:使用如Jackson、Gson等库将Java对象转换为JSON字符串,再转换回对象。JSON可读性强,但体积相对较大,适用于对可读性要求高、性能要求不是极高的场景。
- 二进制编解码:
- 自定义二进制编解码:根据业务需求自定义字节数组的格式进行编解码,如定义头部长度、消息体长度等字段,实现高效的二进制数据传输,适用于对性能和空间要求极高的场景。