您的位置:首页 > 其它

通信消息协议组件Darks Codec正式发布

2014-06-05 10:56 453 查看




通信消息协议组件Darks Codec正式发布
2014-05-16 09:58 by 见习记者

darkshadow 评论(8)
有5311人浏览 收藏


通信协议
java
编码
框架

序列化

声明:ITeye资讯文章的版权属于ITeye网站所有,严禁任何网站转载本文,否则必将追究法律责任!

<

> 猎头职位: 上海:
Junior Product Manager

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的协议:

Protocol代码



FB FA [ID 32bits] [VERSION 8bits] [COMMAND] FF

FB FA  [ID 32bits] [VERSION 8bits] [COMMAND]  FF

只需简单构建JAVA对象

Java代码



public class SimpleMsg { int id; byte version; String command; }

public class SimpleMsg
{
int id;
byte version;
String command;
}

然后构建编码器

Java代码



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)));

填充数据并编码

Java代码



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); //编码

输出的结果为

Protocol代码



FB FA 20 00 00 00 01 72 75 6E 6E 69 6E 67 FF

FB FA   20 00 00 00   01   72 75 6E 6E 69 6E 67   FF


动态长度计算

除了采用前置和后置标识的方式来避免粘包断包问题外,还可以使用前置标识加总长度的方式。如果将编码器修改为

Java代码



//设置总长度类型,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)));

输出结果为

Protocol代码



FB FA 12 00 00 00 20 00 00 00 01 72 75 6E 6E 69 6E 67

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐