Netty——高级内置解码器、编码器、ByteBuf
netty通讯需要对数据进行编码,解码,于是我们需要用到netty的编码器、解码器
netty 提供的解码器
DelimiterBasedFrameDecoder 解决TCP的粘包解码器
StringDecoder 消息转成String解码器
LineBasedFrameDecoder 自动完成标识符分隔解码器
FixedLengthFrameDecoder 固定长度解码器,二进制
Base64Decoder base64 解码器
netty 提供的编码器
Base64Encoder base64编码器
StringEncoder 消息转成String编码器
LineBasedFrameDecoder 自动完成标识符分隔编码器 MessageToMessageEncoder 根据 消息对象 编码为消息对象 对于 netty的数据传递都是ByteBuf,我们一般重写以上的解码器、编码器来实现自己的逻辑
1、DelimiterBasedFrameDecoder 解决TCP的粘包解码器
IODecoder 继承
/**
* 解码
* DelimiterBasedFrameDecoder 防止 沾包
* @author flm
* 2017年10月30日
*/
public class IODecoder extends DelimiterBasedFrameDecoder { public static final AttributeKey<DeviceSession> KEY = AttributeKey.valueOf("IO"); // 保存
private static final Logger log = Logger.getLogger(IODecoder.class); // 防止 沾包 分隔符
private static ByteBuf delimiter = Unpooled.copiedBuffer("\n".getBytes()); // 沾包 分割符 \n
private static int maxFrameLength = 1024 * 6; //数据大小 public IODecoder() {
super(maxFrameLength, delimiter);
} /**
* 重新 自定义解码
*/
@Override
protected Object decode(ChannelHandlerContext ctx, ByteBuf buffer) throws Exception {
// 对数据 buffer 解码
return super.decode(ctx, buffer);
}
}
2、MessageToMessageEncoder 编码器
/**
* 指令 编码
* MessageToMessageEncoder<PushEntity>
* 把 PushEnty 编码为string
* @author flm
* 2017年11月3日
*/
public class IOEncoder extends MessageToMessageEncoder<PushEntity> { private static final Logger LOG = Logger.getLogger(IOEncoder.class); public IOEncoder() {
super();
} /**
* 重写 编码
*/
@Override
protected void encode(ChannelHandlerContext ctx, PushEntity msg, List<Object> out) throws Exception {
try {
PushEntity push = (PushEntity) msg; } // 以字符串 形式 发送
out.add(ByteBufUtil.encodeString(ctx.alloc(), CharBuffer.wrap(msg.toString()), Charset.defaultCharset())); } catch (Exception e) { e.printStackTrace(); }
}
}
3、 FixedLengthFrameDecoder 固定长度解码器,二进制
/**
*
* 功能描述:协议消息解码器
* 把 btyeBuf 转为 RootMessage对象
*
*/
public class GT06MsgDecoder extends LengthFieldBasedFrameDecoder
{
public GT06MsgDecoder()
{
super(65540, 2, 1, 2, 0); //继承
} /*
* 重写 解码
*/
@Override
public Object decode(ChannelHandlerContext ctx, ByteBuf in) throws Exception
{
ByteBuf frame = (ByteBuf) super.decode(ctx, in);
// 读取 ByteBuf 是根据 位数来读取的
try
{
if (frame == null)
{
return null;
} int frameLen = frame.readableBytes(); // 起始位
byte[] header = new byte[GT06Constant.START_DELIMITER_LEN]; frame.readBytes(header); // 是否是0x79 0x79 开头的扩展包
boolean extPacket = false; if(Arrays.equals(GT06Constant.PACKET_START_EXT, header))
{
extPacket = true;
} int contentLen = MessageUtils.getContentLen(frameLen, extPacket); // 跳过包长度
frame.skipBytes(MessageUtils.getPacketSizeLen(extPacket)); // 消息内容
byte[] msgContent = new byte[contentLen]; // 消息序列号
byte[] sequence = new byte[GT06Constant.MESSAGE_SERIAL_LEN]; // crc校验码
byte[] crc = new byte[GT06Constant.CRC_ITU_LEN]; // 终止符
byte[] endDelimiter = new byte[GT06Constant.END_DELIMITER_LEN];
return new RootMessage(action, sequence, msgContent);
}
finally
{
if(frame != null)
{
frame.release();
}
}
}
其它的编码器,解码器都大同小异,不懂的可以看源码
其实解码、编码,最最重要的是对BtyeBuf的读取
BtyeBuf读操作主要提供以下功能:
- readByte:取1字节的内容;
- skipBytes: 跳过内容
- readUnsignedByte:取1字节的内容,返回(
(short) (readByte() & 0xFF)
);(能把负数转换为无符号吗?) - readShort:取2字节的内容,返回转换后的
short
类型; - readUnsignedShort:取2字节的内容,返回
readShort() & 0xFFFF
; - readMedium:取3字节的内容,返回转换后的
int
类型; - readUnsignedMedium:取3字节的内容,返回转换后的
int
类型; - readInt:取4字节的内容;
- readUnsignedInt:取4字节的内容,返回
readInt() & 0xFFFFFFFFL
; - readLong:取8字节的内容;
- readChar:取1字节的内容;
- readFloat:取4字节的int内容,转换为
float
类型; - readDouble:取8字节的long内容,转换为
double
类型; - readBytes:取指定长度的内容,返回
ByteBuf
类型; - readSlice:取指定长度的内容,返回
ByteBuf
类型; - readBytes:取指定长度的内容到目标容器。
写操作
写操作提供的功能主要是往ByteBuf中写入byte内容,不再一一赘述。主要区别在于写入前根据类型转换为相对应长度的byte数组。
主要函数是:writeBoolean、writeByte、writeShort、writeMedium、writeInt、writeLong、writeChar、writeFloat、writeDouble、writeBytes、writeZero。
边界值安全
不论读或写,肯定会存在ByteBuf数据为空或满的情形,作为数据容器,要存在边界值检查,确保读写安全。
Netty——高级内置解码器、编码器、ByteBuf的更多相关文章
- Netty高级应用及聊天室实战
Netty 高级应用 1. 编解码器 概念:在网络应用中,需要实现某种编解码器.将原始字节数据与自定义消息数据进行相互转换.网络中都是以字节码的形式传输的. 对Netty而言,编解码器由两部分组成:编 ...
- Netty 系列三(ByteBuf).
一.概述和原理 网络数据传输的基本单位总是字节,Netty 提供了 ByteBuf 作为它的字节容器,既解决了 JDK API 的局限性,又为网络应用程序提供了更好的 API,ByteBuf 的优点: ...
- netty高级篇(3)-HTTP协议开发
一.HTTP协议简介 应用层协议http,发展至今已经是http2.0了,拥有以下特点: (1) CS模式的协议 (2) 简单 - 只需要服务URL,携带必要的请求参数或者消息体 (3) 灵活 - 任 ...
- Netty实战五之ByteBuf
网络数据的基本单位总是字节,Java NIO 提供了ByteBuffer作为它的字节容器,但是其过于复杂且繁琐. Netty的ByteBuffer替代品是ByteBuf,一个强大的实现,即解决了JDK ...
- Netty(7)源码-ByteBuf
一.ByteBuf工作原理 1. ByteBuf是ByteBuffer的升级版: jdk中常用的是ByteBuffer,从功能角度上,ByteBuffer可以完全满足需要,但是有以下缺点: ByteB ...
- Netty——高级发送和接收数据handler处理器
netty发送和接收数据handler处理器 主要是继承 SimpleChannelInboundHandler 和 ChannelInboundHandlerAdapter 一般用netty来发送和 ...
- netty: 以默认的ByteBuf作为传输数据
client部分代码: //线程 EventLoopGroup worker = new NioEventLoopGroup(); //辅助类 Bootstrap b = new Bootstrap( ...
- 【Netty技术专题】「原理分析系列」Netty强大特性之ByteBuf零拷贝技术原理分析
零拷贝Zero-Copy 我们先来看下它的定义: "Zero-copy" describes computer operations in which the CPU does n ...
- Netty 核心容器之ByteBuf 结构详解
原文链接 Netty 核心容器之ByteBuf 结构详解 代码仓库地址 Java的NIO模块提供了ByteBuffer作为其字节存储容器,但是这个类的使用过于复杂,因此Netty实现了ByteBuf来 ...
随机推荐
- 回归——继续我的ACM之路!!
回归啦~~18年省赛结束后第一次参赛拿到了省级银牌对我是一个很大的鼓励,这是所感兴趣的事,我能做的不错,也就不愧于心了. 修整了两周多左右,建了建模,和阔爱的对象狂了两周,终于要静下来了,静下来一想, ...
- spring boot 整合 mybatis 以及原理
同上一篇文章一样,spring boot 整合 mybatis过程中没有看见SqlSessionFactory,sqlsession(sqlsessionTemplate),就连在spring框架整合 ...
- ORACLE ERP consolidation流程(一)
原文地址:ORACLE ERP consolidation流程(一) 作者:wolfyuan ORACLE EBS by transaction consolidation的详细流程(一)[@more ...
- CentOS 7通过Firewall开放防火墙端口
发现在CentOS 7上开放端口用iptables没效果(或者是sodino没找到正确的命令,传说Centos7 下默认的防火墙是 Firewall,替代了之前的 iptables)… 使用firew ...
- 量子力学与广义相对论的统一——用广义相对论解释海森堡测不准原理 Unification of Quantum Mechanics and General Relativity: Explaining Heisenberg Uncertainty Principle with General Relativity
从海森堡测不准原理的实验开始: 从实验中可以看到,当有光源测定路线,且双孔打开的时候,接收板原波谷处变成了波峰. 对此,广义相对论的解释是:此时电子经过双孔后的轨迹发生了变化.双孔周围的空间弯曲度被光 ...
- C++ OCCI API数据库操作之连接、返回查询结果集为json格式
使用C++操作数据库,转换返回结果集为json格式,易于解析. 以下程序的编译.运行环境:Windows 10 1803.VS2017 17.5.2(vc14).解决方案配置:Release.解决方案 ...
- dev gridview自动列宽和单元、行、checkbox选中和多选
#region 自动列宽 for (int I = 0; I < gridView1.Columns.Count; I++) { this.gridView1.BestFitColumns(); ...
- 定时任务 Wpf.Quartz.Demo.1
Quartz 是个开源的作业调度框架. 安装:Install-Package Quartz 官网文档地址:https://www.quartz-scheduler.net/documentation/ ...
- .net4.0 请求HTTPS出错:未能创建 SSL/TLS 安全通道
两种方法: 1.在代码中修改 ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;// SecurityProtocol ...
- [学习笔记]后缀自动机SAM
好抽象啊,早上看了两个多小时才看懂,\(\%\%\%Fading\) 早就懂了 讲解就算了吧--可以去看看其他人的博客 1.[模板]后缀自动机 \(siz\) 为该串出现的次数,\(l\) 为子串长度 ...