zoukankan      html  css  js  c++  java
  • netty-编码解码器

    1.基本介绍

    • 当Netty发送或者接受一个消息的时候,就将会发生一次数据转换。入站消息会被解码:从字节转换为另一种格式(比如java对象);如果是出站消息,它会被编码成字节。
    • Netty提供一系列实用的编解码器,他们都实现了ChannelInboundHadnler或者ChannelOutboundHandler接口。在这些类中,channelRead方法已经被重写了。以入站为例,对于每个从入站Channel读取的消息,这个方法会被调用。随后,它将调用由解码器所提供的decode()方法进行解码,并将已经解码的字节转发给ChannelPipeline中的下一个ChannelInboundHandler。

    2.解码器-ByteToMessageDecoder

    实例分析

    public class ByteDeco extends ByteToMessageDecoder {
        /**
         *
         * decode 会根据接收的数据,被调用多次, 直到确定没有新的元素被添加到list
         * , 或者是ByteBuf 没有更多的可读字节为止
         * 如果list out 不为空,就会将list的内容传递给下一个 channelinboundhandler处理, 该处理器的方法也会被调用多次
         *
         * @param ctx 上下文对象
         * @param in 入站的 ByteBuf
         * @param out List 集合,将解码后的数据传给下一个handler
         * @throws Exception
         */
        @Override
        protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
    
            System.out.println("ByteToMessageDecode解码器被调用了......");
            //因为 long 8个字节, 需要判断有8个字节,才能读取一个long
            if(in.readableBytes() >= 8) {
                out.add(in.readLong());
            }
        }
    }

    3.解码器-ReplayingDecoder

    实例分析

    public class RepDeco extends ReplayingDecoder<Void> {
        @Override
        protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
    
            System.out.println("ReplayingDecoder解码器被调用了......");
            //在 ReplayingDecoder 不需要判断数据是否足够读取,内部会进行处理判断
            out.add(in.readLong());
    
    
        }
    }

    4.MessageToByteEncoder编码器

    实例分析

    public class MTBEnco extends MessageToByteEncoder<Long> {
        //编码方法
        @Override
        protected void encode(ChannelHandlerContext ctx, Long msg, ByteBuf out) throws Exception {
    
            System.out.println("MessageToByteEncoder编码器被调用,即将编码:"+msg);
            out.writeLong(msg);
    
        }
    }
  • 相关阅读:
    基于 HTML5 + WebGL 实现的垃圾分类系统
    B/S 端基于 HTML5 + WebGL 的 VR 3D 机房数据中心可视化
    基于 Web 端 3D 地铁站可视化系统
    HTML5 + WebGL 实现的垃圾分类系统
    基于HTML5 WebGL的工业化3D电子围栏
    iOS 不支持 PWA,那又怎么样?
    PWA 入门: 写个非常简单的 PWA 页面
    iOS UTI
    canOpenURL: failed for URL: "weixin://app/wx 问题解决方式
    iOS扩大UIButton按钮的可点击区域
  • 原文地址:https://www.cnblogs.com/hyy9527/p/13100676.html
Copyright © 2011-2022 走看看