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; }
然后构建编码器
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); //编码
输出的结果为
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)));
输出结果为
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
8 楼 freezingsky 2014-06-04 21:40
7 楼 Cindy_Lee 2014-05-19 11:10
6 楼 diggywang 2014-05-19 10:46
5 楼 shenshouer 2014-05-19 10:05
4 楼 nodexy 2014-05-19 09:42
3 楼 andot 2014-05-17 13:29
2 楼 ostholz 2014-05-16 15:55
1 楼 sayji 2014-05-16 13:13