赞
踩
Google Protocol Buffer(简称protobuf)是Google内部混合语言数据标准,protobuf是一种紧凑的可扩展的二进制消息格式,适合做网络数据传输、数据存储的消息格式(摘自网络)。这里不介绍protobuf的基本用法,详情可以参考: 1. ProtoBuf语法指南 http://colobu.com/2015/01/07/Protobuf-language-guide/ 2. 玩转ProtoBuf http://www.searchtb.com/2012/09/protocol-buffers.html 3. Protobuf 反射和相关API http://name5566.com/2473.html
这里主要介绍Muduo中使用ProtoBuffer实现消息类型自解析自动调用相应的处理函数,对应的代码为: https://github.com/chenshuo/muduo/tree/master/examples/protobuf/codec
首先我们要描述一下需要解决的问题:1. 处理端有各种消息的完整类型,但是不知道当前接收的消息类型(消息识别) 2. 处理端可以正确处理不同种类的消息(消息解析 + 消息处理)。2. 处理端不要用大量的if else或者switch来判断消息的类型然后做相应的处理 (代码不要太丑陋太难维护)
为了达到消息识别的目的,首先需要定义消息格式:
len : 消息长度
namelen : 消息类型名长度
messageName : 消息类型名
protoBufData : 消息体数据
checkSum : 校验和 (这里使用 adler32 算法)
注意:使用ProtoBuffer进行传输是不需要消息的版本号的,因为ProtoBuffer支持optional字段,可以通过增加或减少optional字段来实现不同版本的消息,而且不会引起解析错误。
当处理端收到消息后,应该怎样处理了,注意处理端收到的字节流很可能不能构成一个完整的消息,也可能构成多个消息
对数据的解码在ProtobufCodec类中,onMessage函数就是处理原始字节流的,parse函数从原始字节流中提取出消息
这里很重要的一点就是如何根据消息类型名创建一个消息,createMessage完成这个功能
该函数用到的几个重要的步骤:
消息的处理是在函数messageCallBack_中进行,这个函数是我们在创建QueryServer时绑定的:
onProtobufMessage根据每个类型的descriptor来从一张表中查找处理函数,因为每种类型都有一个全局的Descriptor对象,它的地址不变,因此使用它来查找注册的函数
至此,我们就实现了消息的自解析和自处理。
向原创致敬,转自:http://blog.chinaunix.net/uid-28587158-id-5193485.html
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。