请选择 进入手机版 | 继续访问电脑版

【Netty】原理分析:编解码器

[复制链接]
命中不缺你 发表于 2021-1-3 12:06:05 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
当你通过 Netty 发送大概担当一个消息的时候,就将会发生一次数据转换


  • 入站时 – 消息被解码(Decode):从字节(二进制)转换为我们能读懂并操纵的格式(int、String、Java对象…)
  • 出站时 – 消息被编码(Encode):从我们能读懂并操纵的格式的形式(int、String、Java对象…)转换为字节形式(二进制)
Netty 提供了一系列实用的编码解码器,好比编解码字符串的 StringEncoder 和 StringDecoder,编解码对象的 ObjectEncoder 和ObjectDecoder 等,他们都实现了 ChannelInboundHadnler 大概 ChannelOutcoundHandler 接口。

在这些类中, channelRead 方法已经被重写了。以入站为例,对于每个从入站 Channel 读取的消息,这个方法会被调用。随后,它将调用由已知解码器所提供的 decode() 方法举行解码,并将已经解码的字节转发给 ChannelPipeline 中的下一个 ChannelInboundHandler。
除了 Netty 已经实现的,我们也可以通过集成 MessageToByteEncoder,ByteToMessageDecoder 自界说编解码器。
  1. /** 自界说编码器* 实现 MessageToByteEncoder接口,重写 encode 方法* 注:通过泛型指定可以编码数据范例*/public class LongToByteEncoder extends MessageToByteEncoder {    @Override    protected void encode(ChannelHandlerContext ctx, Long msg, ByteBuf out) throws Exception {        System.out.println("LongToByteEncoder encode被调用");        System.out.println("msg=" + msg);        // 关键!!将编码效果通过 pipeline 继承向下通报,继承担当处理处罚        out.writeLong(msg);    }}
复制代码
  1. /** 自界说解码器* 实现 ByteToMessageDecoder 接口,重写 decode 方法*/public class ByteToLongDecoder extends ByteToMessageDecoder {    @Override    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List out) throws Exception {        System.out.println("ByteToLongDecoder decode 被调用");        // 注:因为 long 8个字节, 需要判定有8个字节,才华读取一个long        if(in.readableBytes() >= 8) {                // 关键!!将解码效果通过 pipeline 继承向下通报,继承担当处理处罚            out.add(in.readLong());        }    }}
复制代码
然后再将我们的自界说编解码器到场到 ChannelPipeline 中
  1. public class NettyServerInitailizer extends ChannelInitializer {    @Override    protected void initChannel(SocketChannel socketChannel) {        ChannelPipeline pipeline = socketChannel.pipeline();                // 入站-Decode                pipeline.addLast(new ByteToLongDecoder());                // 出栈-Encode                pipeline.addLast(new LongToByteEncoder());                // 自界说的 Handler                pipeline.addLast(new NettyServerHandler());    }}
复制代码
来源:https://blog.csdn.net/weixin_43935927/article/details/112001487
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

发布主题

专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )