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

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. linux防火墙基本操作

    1.查看防火墙运行状态 # firewall-cmd --state 或者 # systemctl status firewalld.service .关闭防火墙 # systemctl stop f ...

  2. .net Ajax与后台一般处理程序(ashx) 交互

    本文主要实现无动态刷新查询后台数据功能,主要用到ajax+ashx+sqlserver进行交互. 首先需要引用Jquery: <script language="javascript& ...

  3. TCP三次握手(建立连接)/四次挥手(关闭连接)

    TCP数据包格式 顺序号(32位):用来标识从TCP源端向TCP目的端发送的数据字节流,它表示在这个报文段中的第一个数据字节的顺序号.如果将字节流看作在两个应用程序间的单向流动,则TCP用顺序号对每个 ...

  4. git编译安装与常见问题解决

    1. 先去官网下载一个安装包 ,假设目录/APP/ido   2. cd /APP/ido   3. tar -zxvf git-2.7.2.tar.gz   4. 安装依赖 yum -y insta ...

  5. 用CSS3实现饼状loading效果

    原文地址:http://visugar.com/2017/05/17/CSS3%E9%A5%BC%E7%8A%B6loading%E6%95%88%E6%9E%9C/ 写在前面 (附录有源码及效果) ...

  6. 看透SpringMVC源代码分析与实践 Markdown记录

    kantouspringmvc 看透SpringMVC中文版电子书,使用Markdown语法记录学习<看透SpringMVC>的内容,方便自己整理知识,并在原作者写作的基础上添加自己的理解 ...

  7. CountDownLatch, CyclicBarrier and Semaphore

    Reference: [1] http://shazsterblog.blogspot.co.uk/2011/12/comparison-of-countdownlatch.html CountDow ...

  8. Ultimus BPM 零售和快消品行业应用解决方案

    Ultimus BPM 零售和快消品行业应用解决方案 行业应用需求 中国零售及快消品行业正在经历深刻变化.经济下滑,消费回落,行业危机继续发酵:人员工资.房租费用进一步上涨,成本高涨成为不能承受之重: ...

  9. 第 18 章 高可用设计之 MySQL 监控

    前言: 一个经过高可用可扩展设计的 MySQL 数据库集群,如果没有一个足够精细足够强大的监控系统,同样可能会让之前在高可用设计方面所做的努力功亏一篑.一个系统,无论如何设计如何维护,都无法完全避免出 ...

  10. 修改node来增加自定义工具命令

    如何通过node创建自定义cmd命令 一.命令功能的实现 1.将自己的自定义工具的文件夹放到当前使用的 node 的安装目录下的 node_modules 文件夹下面: 2.回到node安装目录下复制 ...