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

DarksCodec是一个轻量级高效的通信消息协议编解码框架,支持JAVA对象与大部分基于字节的消息协议之间进行互相转换,提供多种策略动态计算字节流总长度,支持多种校验码、压缩、加密处理,以及复杂对象协议转换,简化了消息协议的实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


原创新闻 通信消息协议组件Darks Codec正式发布
2014-05-16 09:58 by 见习记者 darkshadow 评论(8) 有5311人浏览 收藏Spinner

      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代码 复制代码
  1. FB FA  [ID 32bits] [VERSION 8bits] [COMMAND]  FF  

 只需简单构建JAVA对象

Java代码 复制代码
  1. public class SimpleMsg  
  2. {  
  3.       int id;  
  4.       byte version;  
  5.       String command;  
  6. }  
public class SimpleMsg
{
      int id;
      byte version;
      String command;
}

 然后构建编码器

Java代码 复制代码
  1. ObjectCoder coder = new ObjectCoder();  
  2. //设置LITTLE-ENDIAN  
  3. coder.getCodecConfig().setEndianType(EndianType.LITTLE);  
  4. //添加前置标识为0xFAFB,后置标识位0xFF  
  5. 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代码 复制代码
  1. SimpleMsg msg = new SimpleMsg();  
  2. msg.id = 32;  
  3. msg.version = 1;    
  4. msg.command = "running";  
  5. byte[] bytes = coder.encode(msg); //编码  
SimpleMsg msg = new SimpleMsg();
msg.id = 32;
msg.version = 1;  
msg.command = "running";
byte[] bytes = coder.encode(msg); //编码

 输出的结果为

Protocol代码 复制代码
  1. FB FA   20 00 00 00   01   72 75 6E 6E 69 6E 67   FF  

 

动态长度计算

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

Java代码 复制代码
  1. //设置总长度类型,HEAD_BODY表示总长度包含头长度和内容长度,除此之外还有BODY/AUTO  
  2. coder.getCodecConfig().setTotalLengthType(TotalLengthType.HEAD_BODY);  
  3. //只添加前置标识  
  4. 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代码 复制代码
  1. 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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值