
声明:ITeye资讯文章的版权属于ITeye网站所有,严禁任何网站转载本文,否则必将追究法律责任!
猎头职位:Darks Codec是一个轻量级高效的通信消息协议编解码框架。它支持将JAVA对象与绝大部分基于字节的消息协议之间进行互相转换,以此协助开发人员便捷有效的快速构建消息协议,并为粘包、断包等问题提供了有效的解决方案。它能让开发人员从消息协议的实现中解脱出来,让其更多的关注于消息通信协议的设计及优化,以便让软件消息通信的整体设计更加完善。
项目开源地址:https://github.com/liulhdarks/darks-codec
项目发布地址:https://github.com/liulhdarks/darks-codec/releases
Version 1.0.3 release特性支持:
- 支持采用JAVA对象定义简单或复杂的消息协议。
- 支持JAVA对象与通信协议字节流之间进行互相转换。
- 支持多种策略动态计算字节流总长度。
- 支持向消息协议增加CRC16、ADLER32、自定义等校验码。
- 支持对消息协议字节流进行多种类型或自定义方式的压缩处理。
- 支持对消息协议字节流进行多种类型或自定义方式的加密处理。
- 支持自定义协议Wrapper,以此实现更多扩展功能。
- 支持复杂对象协议转换。
- 支持多种数据类型,数据类型可自定义。
- 支持数组类型数据。
- 支持数据长度自动计算。
- 支持简洁的JAVA对象序列化/反序列化方法,生成的字节流简洁可配去冗余。
简单的配置方式
只需要几行参数设置便能实现基础的消息协议。例如一个基于LITTLE-ENDIAN的协议:
- FB FA [ID 32bits] [VERSION 8bits] [COMMAND] FF
只需简单构建JAVA对象
- public class SimpleMsg
- {
- int id;
- byte version;
- String command;
- }
public class SimpleMsg
{
int id;
byte version;
String command;
}
然后构建编码器
- ObjectCoder coder = new ObjectCoder();
- //设置LITTLE-ENDIAN
- coder.getCodecConfig().setEndianType(EndianType.LITTLE);
- //添加前置标识为0xFAFB,后置标识位0xFF
- coder.getCodecConfig().addWrap(new IdentifyWrapper(new OCInt16(0xFAFB), new OCInt8(0xFF)));
ObjectCoder coder = new ObjectCoder();
//设置LITTLE-ENDIAN
coder.getCodecConfig().setEndianType(EndianType.LITTLE);
//添加前置标识为0xFAFB,后置标识位0xFF
coder.getCodecConfig().addWrap(new IdentifyWrapper(new OCInt16(0xFAFB), new OCInt8(0xFF)));
填充数据并编码
- SimpleMsg msg = new SimpleMsg();
- msg.id = 32;
- msg.version = 1;
- msg.command = "running";
- byte[] bytes = coder.encode(msg); //编码
SimpleMsg msg = new SimpleMsg();
msg.id = 32;
msg.version = 1;
msg.command = "running";
byte[] bytes = coder.encode(msg); //编码
输出的结果为
- FB FA 20 00 00 00 01 72 75 6E 6E 69 6E 67 FF
动态长度计算
除了采用前置和后置标识的方式来避免粘包断包问题外,还可以使用前置标识加总长度的方式。如果将编码器修改为
- //设置总长度类型,HEAD_BODY表示总长度包含头长度和内容长度,除此之外还有BODY/AUTO
- coder.getCodecConfig().setTotalLengthType(TotalLengthType.HEAD_BODY);
- //只添加前置标识
- coder.getCodecConfig().addWrap(new IdentifyWrapper(new OCInt16(0xFAFB)));
//设置总长度类型,HEAD_BODY表示总长度包含头长度和内容长度,除此之外还有BODY/AUTO
coder.getCodecConfig().setTotalLengthType(TotalLengthType.HEAD_BODY);
//只添加前置标识
coder.getCodecConfig().addWrap(new IdentifyWrapper(new OCInt16(0xFAFB)));
输出结果为
- FB FA 12 00 00 00 20 00 00 00 01 72 75 6E 6E 69 6E 67
协议封装体
通过协议封装体能够实现添加校验码、加密、压缩、标识等功能,开发者可以自定义封装体在编解码前/后期处理协议数据。
对象精简序列化
JAVA自身的序列化会自动增加较多的附加数据,在部分情况下过于冗余。通过Darks Codec的ObjectSerial可以轻松序列化对象,对象无需实现Serializable接口,并且生成的字节精简有效可配,更可以避免粘包断包等问题。
更多功能详细请参见官网 README.MD