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

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

定义如上的消息结构

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

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

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

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

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

典型的RPC框架有protobufthrift,这些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 <sstream>
#include <tuple>
#include <string>
#include <Icaller.h>
#include <Ichannel.h>
#include <boost/any.hpp>
#include <boost/make_shared.hpp> namespace caller
{
class test : public juggle::Icaller {
public:
test(boost::shared_ptr<juggle::Ichannel> _ch) : Icaller(_ch) {
module_name = "test";
} ~test(){
} void test_func(std::string argv0,int64_t argv1){
auto v = boost::make_shared<std::vector<boost::any> >();
v->push_back("test");
v->push_back("test_func");
v->push_back(boost::make_shared<std::vector<boost::any> >());
(boost::any_cast<boost::shared_ptr<std::vector<boost::any> > >((*v)[]))->push_back(argv0);
(boost::any_cast<boost::shared_ptr<std::vector<boost::any> > >((*v)[]))->push_back(argv1);
ch->push(v);
} }; }

服务器端

/*this module file is codegen by juggle for c++*/
#include <Imodule.h>
#include <boost/shared_ptr.hpp>
#include <boost/signals2.hpp>
#include <string>
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<void(std::string, int64_t) > sigtest_funchandle;
void test_func(boost::shared_ptr<std::vector<boost::any> > _event){
sigtest_funchandle(
boost::any_cast<std::string>((*_event)[0]),
boost::any_cast<int64_t>((*_event)[1]));
} }; }

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

juggle地址:https://github.com/qianqians/abelkhan/tree/master/juggle

欢迎大家到abelkhan的相关论坛提出bug和意见:http://abelkhan.com/forum.php?mod=forumdisplay&fid=2

使用juggle简化网络编程的更多相关文章

  1. VC++ 网络编程总结(一)

    1.套接字编程原理         一个完整的网间通信进程需要由两个进程组成,并且只能用同一种高层协议.也就是说,不可能通信的一段用TCP,而另一端用UDP.一个完整的网络信息需要一个五元组来标识:协 ...

  2. [C# 网络编程系列]专题三:自定义Web服务器

    转自:http://www.cnblogs.com/zhili/archive/2012/08/23/2652460.html 前言: 经过前面的专题中对网络层协议和HTTP协议的简单介绍相信大家对网 ...

  3. 猫哥网络编程系列:HTTP PEM 万能调试法

    注:本文内容较长且细节较多,建议先收藏再阅读,原文将在 Github 上维护与更新. 在 HTTP 接口开发与调试过程中,我们经常遇到以下类似的问题: 为什么本地环境接口可以调用成功,但放到手机上就跑 ...

  4. C++11网络编程

    Handy是一个简洁优雅的C++11网络库,适用于linux与Mac平台.十行代码即可完成一个完整的网络服务器. 下面是echo服务器的代码: #include <handy/handy.h&g ...

  5. python网络编程-socket编程

     一.服务端和客户端 BS架构 (腾讯通软件:server+client) CS架构 (web网站) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二.OSI七层 ...

  6. python之Socket网络编程

    什么是网络? 网络是由节点和连线构成,表示诸多对象及其相互联系.在数学上,网络是一种图,一般认为专指加权图.网络除了数学定义外,还有具体的物理含义,即网络是从某种相同类型的实际问题中抽象出来的模型.在 ...

  7. Python-socket网络编程

    一.计算机网络 多台独立的计算机用网络通信设备连接起来的网络.实现资源共享和数据传递.比如,我们之前的学过的知识可以将D盘的一个文件传到C盘,但如果你想从你的电脑传一个文件到我的电脑上目前是做不到的; ...

  8. Python之路【第七篇】python基础 之socket网络编程

    本篇文章大部分借鉴 http://www.cnblogs.com/nulige/p/6235531.html python socket  网络编程 一.服务端和客户端 BS架构 (腾讯通软件:ser ...

  9. 【深入浅出Linux网络编程】 “实践 -- TCP & UDP”

    通过上一篇博客的学习,你应该对基于epoll的事件触发机制有所掌握,并且通过阅读sio.c/sio.h应该也学会了如何封装epoll以及如何通过设计令epoll更加实用(用户回调,用户参数). 简单回 ...

随机推荐

  1. WinRAR5.01注册码附注册机

    把下面的注册码复制到"记事本"中,另存为"rarreg.key"文件,放到WinRAR安装目录即完成注册.RAR registration datakjcy8U ...

  2. Linux与堆栈概念

    在学习C/C++编程的时候,老师都会反复灌输一些概念.比如程序内变量在堆栈上的分配,栈是由高地址到低地址,堆是由低地址到高地址等等,然后画出这样一幅经典概念图: 图片来自:http://blog.cs ...

  3. POJ2524并查集水题

    Description There are so many different religions in the world today that it is difficult to keep tr ...

  4. jQ实现的一个轮播图

    众所周知,轮播图是被广泛的运用的. 轮播图我们在很多的网站上都可以看到,例如淘宝.京东这些网站都很常见. 下面开始我们的轮播之旅: 搭建我们的骨架: <!DOCTYPE html> < ...

  5. javaWeb学习总结(3)- Servlet基础

    Servlet的应用 Servlet是一种独立于平台和协议的服务器端的Java应用程序,可以生成动态的web页面.它担当Web浏览器或其他http客户程序发出请求. 与http服务器上的数据库或应用程 ...

  6. (HTTPS)-强制 SSL (HTTPS)Filter

    汗,无知真可怕,Servlert规范中已经有自动跳转到保护页面(Http - Https)的方法了: web.xml       <security-constraint>         ...

  7. javaWeb学习总结(8)- JSP中的九个内置对象(4)

    一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...

  8. java集合(1)- 类底层数据结构分析

    Java 集合类图 参考:http://www.cnblogs.com/xwdreamer/archive/2012/05/30/2526822.html

  9. .net开源权限管理系统

    有业务请加QQ 245747009 源码地址:http://git.oschina.net/sunzewei/EIP 一.更新记录1.更新日期:2017-02-24 00:00:002.更新内容: 版 ...

  10. cpp命名空间

    1.namespace:c++里面的所有标识符都被定义到名为std的namespace中,命名空间就是标识符的各种可见范围,控制其作用域. 2.std为c++标准命名空间,c++标准库里的标识符都定义 ...