废话
能搜到的文档,比我头发还少,有个OpenFast的包是专门解析这玩意的(C++的是QuickFast),但是官网都打不开了,搜又全是风力发电模拟的玩意(也是叫OpenFast这个名字)。
甚至我下载到了一个OpenFast的源码+包+文档,我都无法确定这玩意是不是我要的东西,反正就是令人头大头秃。
通俗理解
FAST协议,详情可以查看《FAST 1.1 规范中文版全文参考》,推荐还是看一下吧,就算不需要懂原理,但想要知道支持哪几种类型也总得翻翻书不是。
通俗点的说法,就是打包解包,可以理解为一个快速的压缩解压算法,或者俗称序列化。如果你用Json字符串,就会有很多的符号冗余之类的问题,哪怕用get请求的那种传值方式,都会是长长的一条字符串,数据量大的时候就会产生流量、带宽、延迟之类的问题,最优解当然是一个字节8位,第一位是0代表啥,1代表啥,第二位0代表啥1代表啥,但是这种方式的可扩展姓比较低,协议成本也比较高。
FAST的主要就是根据类型模板,将一个对象转成一条字符串并且对这个字符串压缩成一个二进制的流,反正就是那么个意思。
程序包
openfast-1.1.2-bin.zip
下载地址:OpenFAST - Browse /openfast4j at SourceForge.net
解压之后,自带文档,就是这个文档有点一言难尽……
openfast-1.1.2-bin\openfast-1.1.2\docs\api\index.html
maven1.1.1版本
<dependency> <groupId>org.openfast</groupId> <artifactId>openfast</artifactId> <version>1.1.1</version> </dependency>
开搞
1、流程
(1)模板(MessageTemplate),其实就是定义有些字段、啥类型,不想写死在代码层,可以写成配置文件,比较友好的是xml文件,不怕麻烦,你也可以自己搞个json文件、yml文件之类的。
(2)上下文(Context),一个编码/解码器一个,不要公用。
(3)编码(FastEncoder)
(4)解码(FastDecoder)
集齐这几样,搞一个最简单的编码解码应该是没啥问题了。
2、直接开搞
//模板
MessageTemplate template = new MessageTemplate("",
new Field[] {
new Scalar("1", Type.I32, Operator.COPY, ScalarValue.UNDEFINED, false),
new Scalar("2", Type.I32, Operator.DELTA, ScalarValue.UNDEFINED, false),
});
//上下文
Context context = new Context();
//注册模板
context.registerTemplate(113, template);
//编码器
FastEncoder encoder = new FastEncoder(context);
Message message = new Message(template);
message.setInteger(1, 109);
message.setInteger(2, 29470);
//编码
byte[] outByte=encoder.encode(message);
InputStream sbs = new ByteArrayInputStream(outByte);
//解码器
FastDecoder fastDecoder=new FastDecoder(context,sbs);
//解码
Message msg111=fastDecoder.readMessage();
log.info("解码的消息1:{}",msg111.getInt(1));
log.info("解码的消息2:{}",msg111.getInt(2));
最后运行结果:
解码的消息1:109
解码的消息2:58940