JSON

【达内科技】C++中消息自动派发之About JSON Encode

字号+ 作者:H5之家 来源:H5之家 2015-11-24 17:05 我要评论( )

《C++ 消息自动派发》系列上篇介绍了IDL解析器,生成的C++代码只支持JSON转C++ struct。 经过新的重构,这次增加了对C++ struct 转JSON的支持。IDL解析器自动为C

【达内科技】C++中消息自动派发之About JSON Encode

 

  《C++ 消息自动派发》系列上篇介绍了IDL解析器,生成的C++代码只支持JSON转C++ struct。 经过新的重构,这次增加了对C++ struct 转JSON的支持。IDL解析器自动为C++ struct生成两个方法。

  decode:实现json 转C++ struct 转。

  encode:实现C++ struct 转json字符串。

  现实应用中,网络服务器程序处理流程如下:

  1> 网络层异步接收Client消息(本文讨论的应用都是基于json协议)

  2> 对消息进行解析,如判断消息类型,消息体字段检查、解析、赋值等。将解析完成的结果封装到特定的struct中(每一个消息类型定义单独一个struct)。注:JSON解析、检查、取值都是再网络线程完成(多线程),通常服务器程序的核心逻辑都是在单线程中完成,故逻辑线程应重点”保护“之。待消息转成struct后,逻辑线程直接操作二进制,尽最大程度提高逻辑线程的实时性、吞吐量。

  3> 逻辑线程处理完请求,一般会产生特定的响应结果(有时是一个,如rpc请求,有时多个,如广播消息)。响应结果仍然要同过json协议发送给client。

  4> 逻辑成生成的响应结果为二进制struct,需要转换成json字符串。同样这些耗时的、与逻辑无关的操作应该放到网络线程。道理还是一样,尽最大程度保证

    逻辑层的效率。

1. 用例

  假设一个玩家查询好友信息接口。client发送get_friends_req请求,参数为uid,服务器查询该user的好友,生成好友列表list,返回消息结果。

  首先定义IDL文件,其中有两个消息体:

get_friends_req_t
{
uint32 uid;
};

//! 定义服务器响应结果消息体类型, ret_t 结尾,代表此消息为响应消息,服务器不需要处理此消息的请求struct all_friends_ret_t
{
array<uint32> friends;
};

对应的服务器实现代码如下所示,稍微做些解释:

  1> socket_t 封装linux socket 文件描述符操作,这里只是个示例,其提供async_write接口,使用preactor模式发送数据。其接受所有消息的基类指针,并且该指针为智能指针,无需手动析构。消息体基类支持encode接口,讲二进制struct转成json字符串,socket则将json字符串通过write系统调用发送给client。

  2> logic_service_t 逻辑层,处理所有的消息请求。针对每一个消息定义重载一个handle函数,为了避免网络层消息传到逻辑层的内存拷贝,这里使用智能指针,同时避免了手动管理。

  3> msg_dispather_t, 这个类是由idl 解析器自动生成的,在生产环境,应该有网络层调用此对象。由于本文只是示例,故忽略网络层,由main模拟网络层调用。

  

cout <<<< msg_->encode_json() <<;
}
};

typedef socket_t* socket_ptr_t;

<< req_->uid <<;
shared_ptr_t<all_friends_ret_t> msg(;
logic_service_t logic_service;
msg_dispather_t<logic_service_t, socket_ptr_t> msg_dispather(logic_service);
socket_ptr_t sock = << e.what() <<;
}
cout <<;
}

2. 使用IDL 生成 C++ 代码:

  idl_generator.py example.idl msg_def.h

  前面定义的example.idl 经过idl_generator.py 分析后生成头文件msg_def.h, 其中包括 msg_dispather_t 的实现,其主要代码为:

);
, jval_[], friends);
, ibj_json, allocator);

rapidjson::Writer<rapidjson::StringBuffer> writer(str_buff, &allocator);
ret_json.Accept(writer);
, dest, friends);
return 0;
}

};

3. encode 和 decode 如何实现

  通过不断开发IDL解析器,进一步优化了json的解析和编码。其中:

  1> json_instream.h 完成json的decode,依次遍历struct中的字段,为其赋值。json_instream_t中重载了支持所有类型参数的decode参数。

  2> json_outstream.h 完成struct 转json,依次遍历struct中的字段,将其转为json value,其重载了支持所有基本类型的encode参数。

  示例代码:

* filed_name_, json_value_t& jval_, uint8_t dest_);
json_outstream_t& encode(* filed_name_, json_value_t& jval_, uint16_t dest_);
json_outstream_t& encode(* filed_name_, json_value_t& jval_, uint32_t dest_);
json_outstream_t& encode(* filed_name_, json_value_t& jval_, uint64_t dest_);
json_outstream_t& encode(* filed_name_, json_value_t& jval_, & dest_);

4. TODO

  1. IDL 解析器已经实现了基本功能,下次准备利用此IDL 解析器实现一个聊天服务器。

   2. IDL 解析器添加对二进制encode/decode的支持。

 

上一篇:【达内培训】C++中消息自动派发之About IDL解析器
下一篇:【成都c++培训】用Python语言显示图片的倒影效果

相关信息

网站首页 | 达内怎么样 | Java培训 | C++培训 | 四川软件培训 | Android培训 | 企业评价 | 视频下载 | 免责声明 | 网站地图

CopyRight © 2002-2014 达内时代科技集团有限公司 [] 版权所有 京ICP备08000853号-8  

全国免费服务热线:400-850-6686   24小时咨询热线:13408601755

先就业后付款,高端Java培训,C++培训,Android培训,软件测试培训,嵌入式培训,PHP培训,成都IT培训,助您就业国内外IT企业!

成都高升桥中心地址:成都市武侯区高升桥东路15号5楼

成都锦江中心地址:成都市青羊区南大街6号中国邮政大厦5楼(月亮村)

成都天府中心地址:成都市青羊区金盾路52号国栋中央商务大厦15楼AB座

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
网友点评
h