Netty 数据在管道中的流通

Netty 数据在管道中的流通

netty框架提供了多种编解码工具类对接收/发送的数据类型进行转化后再放到管道中流通。当然,也可以自己继承抽象类定制自己的编解码工具。今天,以管道中的数据格式转化角度来分析一下管道的工作流程。

一、Read数据

   // 分包,把数据读到buf中
   arg0.pipeline().addLast(new LineBasedFrameDecoder(1024));
   // 把buf中的数据转成string,在管道中流通
   arg0.pipeline().addLast(new StringDecoder());
   // 接收string类型的msg(需要强制转化)
   arg0.pipeline().addLast(new TimeServerHandler());
LineBasedFrameDecoder(ByteToMessageDecoder--读取管道中的Tcp byteBuf缓冲区的分包结果,向管道中放入拆包后的buf对象  
->   StringDecoder(MessageToMessageDecoder)--读取管道中的buf对象,(可以拆分成多个message(也可以不拆分))然后向管道中放入List<Object>对象(这里是List<string>)  
-> TimeServerHandler(ChannelHandlerAdapter)--读取管道中的Object对象,进行业务操作(而不是List<Object>,list中的每个元素都是一个独立的消息,被拆成多个Object)

二、Write

   ch.pipeline()
				    .addLast(
				    // ByteToMessageDecoder  从tcp buf中分包,然后把包中的字节反序列化成对象,放到管道中
					    new ObjectDecoder(
						    1024 * 1024,
						    ClassResolvers
							    .weakCachingConcurrentResolver(this
								    .getClass()
								    .getClassLoader())));
				// MessageToByteEncoder,拿到管道中的object对象,将object对象序列化后写到tcp buf缓冲区
			    ch.pipeline().addLast(new ObjectEncoder());
				// ChannelHandlerAdapter,拿到管道中的object对象,进行业务操作
			    ch.pipeline().addLast(new SubReqServerHandler());

SubReqServerHandler (ChannelHandlerAdapter)(使用ctx.writeAndFlush方法向管道中写入object、string对象)

-> ObjectEncoder(MessageToByteEncoder)(读取管道中的可序列化的对象,转成字节流,写入到tcp buf中)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值