- 原理
使用特殊的字符,将其作为数据包的结束位置,使TCP能够区分完整的业务应用数据边界,按照边界完整地接受Netty传输的数据;
此特殊字符需要保证正式报文数据里面不会出现相同的字符,以免破坏消息传输的完整性
- 代码
1.DelimiterBaseServer:服务器
/**
* 服务器
* @author pdc
*/
public class DelimiterBaseServer {
//字符串分隔符
private static final String delimiter_tag = "@#";
public static void main(String[] args) throws Exception {
int port = 8080;
new DelimiterBaseServer().bind(port);
}
public void bind(int port) throws Exception {
//创建两个EventLoopGroup实例
//EventLoopGroup是包含一组专门用于处理网络事件的NIO线程组
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
//创建服务端辅助启动类ServerBootstrap对象
ServerBootstrap b = new ServerBootstrap();
//设置NIO线程组
b.group(bossGroup, workerGroup)
//设置NioServerSocketChannel,对应与JDK NIO类ServerSocketChannel类
.channel(NioServerSocketChannel.class)
//设置TCP参数,连接请求的最大队列长度
.option(ChannelOption.SO_BACKLOG, 1024)
//设置I/O事件处理类,用来处理消息的编解码以及我们的业务逻辑
.childHandler(new ChannelInitializer<NioSocketChannel>() {
@Override
protected void initChannel(NioSocketChannel ch) throws Exception {
//设置DelimiterBasedFrameDecoder处理器
ByteBuf delimiter = Unpooled.copiedBuffer(delimiter_tag.getBytes());
ch.pipeline().addLast(new DelimiterBasedFrameDecoder