在一个稍微复杂的系统中会涉及到多语言编程,例如:后端C++和JAVA,脚本用LUA,前端可能是C++ AS等等。所以所有模块之间的协议统一变得非常重要,这样做的目的是减少中间的调试和差错。在revolver框架中,实现了一个基于简单的接口语言来实现多语言之间接口协议的实现。所有的协议接口通过一个简单的def文件就可以将协议翻译成对应的语言程序代码,这样尽可能的避免中间环节的差错,也大大提高了编码效率。而且revolver使用的是标准网络字节序描述协议报文数据,所以可以在各种系统下使用各种语言进行混合编程。
协议接口例子
以下是一个revolver的sample_msg.def事例接口程序文档:
#生成的文件名
filetitle = sample_msg
#命名空间
namespace = BASE
#ip地址类型声明
datatype(Inet_Addr)
#数组定义
typedef array<int8> : INT8_ARRAY
typedef array<int32> : INT32_ARRAY
#二进制数据
typedef string : BIN_DATA
#结构体定义
datatype(CDesc)
{
int8 n_type
= 0
string str_desc = ""
INT32_ARRAY arr_fd
INT8_ARRAY arr_status
}
#协议消息ID定义
var SAMPLE_MSGID = 0xff000001
#协议体和消息关联定义
message(CSamplePacket, SAMPLE_MSGID)
{
uint8 msg_type = 0
uint16
seq_id = 0
uint32
user_id = 0
uint64
guid = 0
Inet_Addr
server_addr
BIN_DATA
bin_data
CDesc msg_desc
}
以上是基本的def定义,如果要将协议翻译成c++框架能认识的协议,就需要通过revolver中提供的协议翻译器来进行翻译,协议翻译器在revolver项目中protocol_analysis工程编译得到,会生成一个make.exe。生成make程序后,可在命令行里输入make sample_msg.def c++,就可生成对应的C++接口协议。生成的C++接口文件如下:
namespace BASE {
#define SAMPLE_MSGID 0xff000001
typedef string BIN_DATA;
typedef vector<int32_t> INT32_ARRAY;
typedef vector<int8_t> INT8_ARRAY;
class CDesc
{
public:
CDesc()
{
n_type = 0;
str_desc = "";
}
~CDesc()
{
}
public:
int8_t n_type;
string str_desc;
INT32_ARRAY arr_fd;
INT8_ARRAY arr_status;
friend BinStream& operator<<(BinStream& strm, const CDesc& packet)
{
strm << packet.n_type;
strm << packet.str_desc;
int32_t count_0 = packet.arr_fd.size();
strm << count_0;
for (int32_t i = 0; i < count_0; i++)
{
strm << packet.arr_fd[i];
}
int32_t count_1 = packet.arr_status.size();
strm << count_1;
for (int32_t i = 0; i < count_1; i++)
{
strm << packet.arr_status[i];
}
return strm;
}
friend BinStream& operator>>(BinStream& strm, CDesc& packet)
{
strm >> packet.n_type;
strm >> packet.str_desc;
int32_t count_2 = 0;
strm >> count_2;
packet.arr_fd.resize(count_2);
for (int32_t i = 0; i < count_2; i++)
{
strm >> packet.arr_fd[i];
}
int32_t count_3 = 0;
strm >> count_3;
packet.arr_status.resize(count_3);
for (int32_t i = 0; i < count_3; i++)
{
strm >> packet.arr_status[i];
}
return strm;
}
void Print(std::ostream& os) const
{
os << "CDesc, {";
os << "n_type = " << (int16_t)n_type << ",";
os << "str_desc = " << str_desc << ",";
os << "arr_fd = ";
for (uint32_t i = 0; i < arr_fd.size(); i++)
{
os << arr_fd[i] << ",";
}
os << "arr_status = ";
for (uint32_t i = 0; i < arr_status.size(); i++)
{
os << (int16_t)arr_status[i] << ",";
}
os << "}";
}
friend ostream& operator<<(ostream& os, const CDesc& packet)
{
packet.Print(os);
return os;
}
};
class CSamplePacket : public CBasePacket
{
public:
CSamplePacket()
{
msg_type = 0;
seq_id = 0;
user_id = 0;
guid = 0;
}
~CSamplePacket()
{
}
public:
uint8_t msg_type;
uint16_t seq_id;
uint32_t user_id;
uint64_t guid;
Inet_Addr server_addr;
BIN_DATA bin_data;
CDesc msg_desc;
public:
void Pack(BinStream& strm) const
{
strm << msg_type;
strm << seq_id;
strm << user_id;
strm << guid;
strm << server_addr;
strm << bin_data;
strm << msg_desc;
}
void UnPack(BinStream& strm)
{
strm >> msg_type;
strm >> seq_id;
strm >> user_id;
strm >> guid;
strm >> server_addr;
strm >> bin_data;
strm >> msg_desc;
}
void Print(std::ostream& os) const
{
os << "CSamplePacket, {";
os << "msg_type = " << (uint16_t)msg_type << ",";
os << "seq_id = " << seq_id << ",";
os << "user_id = " << user_id << ",";
os << "guid = " << guid << ",";
os << "server_addr = " << server_addr << ",";
os << "bin_data's size = " << bin_data.size();
os << "msg_desc = " << msg_desc << ",";
os << "}";
}
};
也可以生成lua 或者AS 等。命令make sample_msg.def lua 或者make sample_msg.def as。其他的语言类似,也可以根据项目中使用的语言修改协议翻译器,让它支持你所用的语言。
def协议接口介绍
基础数据类型:
int8
有符号单字节整型数
uint8 无符号单字节整型数
int16 有符号双字节整型数
uint16 无符号双字节整型数
int32 有符号4字节整型数
uint32 无符号4字节整型数
int64 有符号8字节整型数
uint64 无符号8字节整型数
string 字符串
BIN_DATA 二进制数组
Inet_Addr IP v4地址,包括端口
关键字:
var 数字定义关键字
array 数组关键字
datatype 数据结构定义关键字,类似结构体
message 协议定义关键字
typedef 重定义关键字
{ 结构的开始
} 结构的结束
# 注释关键字
综述
revolver提供协议接口编程,就是将自动化引入整个框架,减少因为协议带来的调试和差错,重在提高生产效率。这也是revolver框架的主要特性之一。
分享到:
相关推荐
描述 固定大小的 LIFO 数据结构,可选择不重复。 它们感觉很像数组,但在索引等一些重要领域有所不同。 例如,这对于保存最近动作的历史非常有用。 用法 创建一个新的Revolver : r = Revolver.new(3) #=> #...
左轮手枪 Revolver 是一个 javascript 库,可帮助您构建自己的内容滑块。 它有一个合理的 (说真的... 只需确保您也对 Revolver 的硬依赖项执行相同操作: 和Bean 。 用法 实例化 Revolver 只需要两件事: 容器:通
为了弥补标准方法的僵化和注释负担,我们解决了少数镜头分割的问题:给定很少的图像和很少的像素监督,可以对任何图像进行相应的分割。 我们建议使用引导网络,该网络可以从任何数量的监督中提取潜在的任务表示形式...
blue_revolver
报亭左轮手枪互动式信息亭的chrome扩展程序。 此扩展程序会定期加载具有给定URL的新标签页,并提供各种选项来锁定Chrome,以防止用户逃脱浏览器,同时仍允许他们与加载的页面进行交互。 请注意,无法阻止用户表单...
左轮手枪动态更改所用BRSTM播放器的脚本该脚本主要用于Smash Custom Music,仅在此处发布以存档源代码。
它使用Kotlin编程语言实现。 参考API在此处 。 此应用将具有以下功能 浏览目录 获取产品详细信息(文本,图像) 获取新产品 显示产品类别列表 购物车 新增项目 从购物车中删除商品 查看 营销 获得促销 依存关系
语言:English dm - tab revolver是一个最先进的选项卡切换器,允许您设置选择的选项卡的幻灯片 dm - tab revolver是一种状态 - - 艺术选项卡切换器,允许您设置您选择的选项卡的幻灯片。它是高度可定制的功能将...
$ npm install react-native-revolver-view $ yarn add react-native-revolver-view 其他依赖项: $ npm install react-native-reanimated react-native-gesture-handler @react-native-community/masked-view ...
语言:English (United States) 此扩展程序可以使您的分辨率保持完好无损。
chrome-左轮手枪插件 Chrome插件的前叉,可自动重新加载和切换标签页 在此处查看原始项目: :
抽象精品ppt模板blue_revolver022
语言:English 左轮手枪标签-Kangal版 使用“ Kangal”功能自动旋转打开的标签。 此版本特别为Yiğido制作。 每个小时的第58分钟,您可以显示一个有关Sivas或Kangal的网站。 会议纪要和网站可以自定义。 最好的祝福。
这个扩展允许你保持你的决议完好无损,精美。 支持语言:English (United States)
当您需要跨不同目录解析文件(如果存在)时(例如,在为站点使用不同主题或语言环境时,解决或不适用于您的用例),这将非常有用。 假设您有一个包含文件a.js ,该文件在源目录中使用以下配置: import * from '...
语言:English 自动刷新salesforce仪表板,报告并通过打开的选项卡进行轮换。 由Abaav 自动刷新Salesforce仪表板,报告并在打开的选项卡中轮换
var Revolver = require ( 'react-image-revolver' ) ; React . render ( Revolver ( { images : [ '/img1.jpg' , '/img2.gif' , '/img3.png' ] , // array of img urls interval : 1000 // cycle interval in ms...
Cookie-revolver框架为J2EE Web应用程序提供了双重身份验证安全性,即“我知道的东西”(用户ID /密码)和“我拥有的东西”(加密的一次性cookie)。
旋转变压器-左轮手枪描述通过尝试以惰性方式在给定上下文中查找值来解析值并进行验证。安装$ npm install --save resolver-revolver 由于这非常通用,因此下面是一个示例,该示例NODE_ENV或系统环境解析NODE_ENV ,...
语言:English (United States) 此扩展提高了Atlassian Jira敏捷板的可读性。 与Scrum和看板完美搭配 此扩展提高了Atlassian Jira敏捷板的可读性。 与Scrum和看板板完美配合。 𕓺非常适合壁挂式设备使用当前的...