简介
happy-ip增加network文件夹(路径:./src/network),提供基于happy-ip的protobuf封装,方便间盘侠们基于RPC,快速的开发网络通信框架。之所以要封装protobuf框架,是因为定义底层数据传输结构是繁琐、且易出错的(字节序转换)。让开发者使用protobuf消息,而忽略底层的复杂传输结构,同时提够灵活的、安全的传输结构,是本次network模块的主要目标。此协议框架提供如下功能:
1、更有好的使用(使用者只用关心protobuf消息、而忽略网络传输结构);
2、提供压缩模式传输数据(默认支持klz压缩);
3、支持快速的扩展为其他格式的能力(json、xml等);
4、提供错误自动处理机制(默认会向客户端应答response_error消息);
5、多种日志输出模式(默认为cout、可设置glog输出);
网络传输结构介绍
网络传输结构定义如下
#pragma pack(push, 1)
struct NetworkHeader
{
int session_id; // 会话标识
int message_name_length; // 消息名称长度
int content_length; // 消息内容长度
uint8_t content_compress_type; // 0: 未压缩; 1: klz压缩
uint32_t check_sum; // 头校验和
DEFINE_HOST_NETWORK_CONVERT("44414");
};
#pragma pack(pop)
struct NetworkData
{
NetworkHeader header; // 消息头
string message_name; // 消息名称
string content; // 消息内容
uint32_t check_sum; // 校验和
};
网络传输是按照 NetworkData结构封装的,所有网络传输的数字都是采用网络字节序。
具体类介绍
UtilMessageFactory类
继承happy-ip的messagefactory类,实现I基类IsConsumedForRead与HandleRead函数。IsConsumedForRead是改变调用方式到NetworkConvert类(所有网络转换相关的业务,都到该类实现)的IsConsumed方法。HandleRead函数也是调用NetworkConvert类实现网络数据到protobuf数据转换,同时提供自动错误应答机制,提供Produce方法处理收到的protobuf数据
ServerMessageFactory类
继承UtilMessageFactory类,实现了Produce方法,通过调用映射函数处理protobuf消息。值得注意的是is_response设置的是true。开发者在写服务端的MessageFactory继承此类,后面的用例会详细说明。
ClientMessageFactory类
继承UtilMessageFactory类,实现了Produce方法,通过调用映射函数处理protobuf消息。值得注意的是is_response设置的是false。同时提够closed_print参数,在连接关闭是打印消息。开发者在写客户端的MessageFactory继承此类,后面的用例会详细说明。
NetworkConvert类
网络解析类,提供IsConsumed(是否为完整包)、ToProto(网络结构转换为proto结构)、ToNetwork(proto结构转换为网络结构)等抽象方法。
ProtoNetworkConvert类
继承于NetworkConver类,实现了IsConsumed(是否为完整包)、ToProto(网络结构转换为proto结构)、ToNetwork(proto结构转换为网络结构)等抽象方法,定义了网络传输结构。
ResponseError类
protobuf生成类,原始定义如下:
message ResponseError
{
required int32 error_code = 1;
required string error_string = 2;
}
其他文件说明
quicklz.h、quicklz.cpp:klz压缩实现
output.h:输出模式定义(默认cout、可选glog)
news.h:内部模块传输数据结构
adler32.h、adler32.cpp:checksum32算法实现
资源下载
git地址为:https://github.com/wangziwen333/happy-ip
boost库1.63版本头文件与库文件下载路径:https://download.csdn.net/download/wang19840301/10665704
windows编译参数
cmake .. -LA -DBOOST_INCLUDE_DIR='E:\git\3rdparty\include' -DBOOST_LIB_DIR='E:\git\3rdparty\lib\win32_debug' -DCMAKE_BUILD_TYPE=Debug -DBUILD_EXAMPLES=ON -DBUILD_NETWORK=ON
linux编译参数
cmake .. -LA -DBOOST_INCLUDE_DIR='/mnt/e/git/3rdparty/include' -DBOOST_LIB_DIR='/mnt/e/git/3rdparty/lib/linux_debug' -DCMAKE_BUILD_TYPE=Debug -DBUILD_EXAMPLES=ON -DBUILD_EXAMPLES=ON -DBUILD_NETWORK=ON