博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用juggle简化网络编程
阅读量:6324 次
发布时间:2019-06-22

本文共 2238 字,大约阅读时间需要 7 分钟。

常规的网络编程,在消息处理上大概会采用如下方式

struct msg{    int msg_id;    int msg_len;     //...msg_info};

定义如上的消息结构

接收方接收后,按如上的消息结构解析数据

struct msg * _msg = (struct msg*)data;

然后消息处理,会按msg_id,将消息分发到不同的消息处理函数

switch(_msg->msg_id){     case 1:        //do anything        break;    default:        break;  }

RPC则是对这种繁琐的消息处理过程做了封装,自动生成一一对应的消息响应代码,使开发者可以专注于逻辑的处理。

典型的RPC框架有、,这些RPC提供了作为网络消息定义的DSL语言,用户使用DSL语言定义需要的网络事件,RPC框架即可自动生成客户端的发送和服务端的响应代码,而用户只需要按框架的约束实现网络通信的部分,即可专注于逻辑代码的编写,而不需要处理繁琐而重复的消息响应代码。

juggle是abelkhan服务器框架中的RPC框架。

这个框架采用高度解耦的设计,对数据的打包部分做了分离,而专注于消息响应代码的生成。目前支持c++和c# 2种语言。

使用juggle的方式如下:

定义DSL脚本

module test{    void test_func(string argv1, int argv2);}

使用codegen生成代码:

juggle采用python3.5编写,使用前需要安装python3.5,然后进入juggle所在的目录

如需生成c++代码测执行gencpp.py脚本,如需生成c#代码测执行gencsharp.py脚本

生成的代码如下:

c++代码:

客户端:

/*this caller file is codegen by juggle for c++*/#include 
#include
#include
#include
#include
#include
#include
namespace caller{class test : public juggle::Icaller {public: test(boost::shared_ptr
_ch) : Icaller(_ch) { module_name = "test"; } ~test(){ } void test_func(std::string argv0,int64_t argv1){ auto v = boost::make_shared
>(); v->push_back("test"); v->push_back("test_func"); v->push_back(boost::make_shared
>()); (boost::any_cast
> >((*v)[2]))->push_back(argv0); (boost::any_cast
> >((*v)[2]))->push_back(argv1); ch->push(v); }};}

服务器端

/*this module file is codegen by juggle for c++*/#include 
#include
#include
#include
namespace module{class test : public juggle::Imodule {public: test(){ module_name = "test"; protcolcall_set.insert(std::make_pair("test_func", boost::bind(&test::test_func, this, _1))); } ~test(){ } boost::signals2::signal
sigtest_funchandle; void test_func(boost::shared_ptr
> _event){ sigtest_funchandle( boost::any_cast
((*_event)[0]), boost::any_cast
((*_event)[1])); }};}

使用时客户端定义caller::test对象调用test_func即可,服务器端定义module::test 将响应函数连接到sigtest_funchandle即可。

 

juggle地址:

欢迎大家到abelkhan的相关论坛提出bug和意见:

转载于:https://www.cnblogs.com/qianqians/p/5653052.html

你可能感兴趣的文章
一、WebGL——着色器和绘制
查看>>
ES6-Promise
查看>>
JavaScript设计模式----策略模式
查看>>
Java快速扫盲指南
查看>>
[分享]iOS开发-设置NavigationBar的颜色和字体属性
查看>>
安装Python第三方函数库方法
查看>>
react融合进系统的体验
查看>>
[分享]iOS开发-图片点击点击放大
查看>>
[LintCode] Max Points on a Line
查看>>
SE-0005,一个你可能想知道的 Swift 改进提案
查看>>
从游戏脚本语言说起,剖析Mono所搭建的脚本基础
查看>>
前后端分离项目实践_扩展
查看>>
MSSQL-最佳实践-Always Encrypted
查看>>
关于python中函数的思考
查看>>
使用kubernetes的deployment进行RollingUpdate
查看>>
Python零基础学习笔记(九)—— 随机数
查看>>
真相了!小米 9 透明尊享版叫停发售,其实是三星的锅 ...
查看>>
Android sqlite sql语句基础
查看>>
无人工厂里到底有没有工人?
查看>>
移动端高清、多屏适配方案
查看>>