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

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 anythingbreak;default:break;
}

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

典型的RPC框架有protobuf、thrift,这些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)[2]))->push_back(argv0);(boost::any_cast<boost::shared_ptr<std::vector<boost::any> > >((*v)[2]))->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

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

使用juggle简化网络编程相关推荐

  1. Linux C++/Java/Web/OC Socket网络编程

    一,Linux C++ Socket网络编程 1.什么是TCP/IP.UDP? TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制 ...

  2. python socket tcp客户端_python网络编程socketserver模块(实现TCP客户端/服务器)

    摘录python核心编程 socketserver(python3.x版本重新命名)是标准库中的网络编程的高级模块.通过将创建网络客户端和服务器所必须的代码封装起来,简化了模板,为你提供了各种各样的类 ...

  3. Java基础篇:网络编程

    文章目录 概述 通信要素之一:IP和端口号 通信要素之二:网络协议 TCP网络编程 UDP网络编程 URL编程 总结 概述 Java是 Internet 上的语言,它从语言级上提供了对网络应用程序的支 ...

  4. 完毕port(CompletionPort)具体解释 - 手把手教你玩转网络编程系列之三

       手把手叫你玩转网络编程系列之三    完毕port(Completion Port)具体解释                                                    ...

  5. Linux下网络编程

    Linux下网络编程初步 Linux以其源代码公开闻名于世,并以其稳定性和可靠性雄霸操作系统领域,在网络应用技术方面使用得更加广泛.很久以来它就是Windows的重要对手之一.随着网络时代的来临,Li ...

  6. NIO详解(一):java网络编程IO总结(BIO、NIO、AIO)

    1.基本概念 在Java网络通信中,最基本的概念就是Socket编程了.Socket又称"套接字" 向网络发出请求或者应答网络请求. Socket 和ServerSocket类库位 ...

  7. .net网络编程之一:Socket编程

    在.net下进行网络编程其实也相对比较简单,因为在.net类库已经提供了大量封装好的类.在.net下网络编程比较底层的类是System.Net.Sockets.Socket类,这个类提供了丰富的方法和 ...

  8. python网络编程案例_Python 网络编程_python网络编程基础_python高级编程

    Python 网络编程 Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的 ...

  9. 04.Java网络编程(转载)

    1.网络编程 1.1计算机网络概述 网络编程的实质就是两个(或多个)设备(例如计算机)之间的数据传输. 按照计算机网络的定义,通过一定的物理设备将处于不同位置的计算机连接起来组成的网络,这个网络中包含 ...

最新文章

  1. C++标准库简介(转)
  2. Intellij IDEA就这样配置,快到飞起!
  3. 在Linux上分析硬件检测日志
  4. 专题 18 Inline Assembly(在C语言中嵌套使用汇编)
  5. JVM调优系列:(四)GC垃圾回收
  6. php 实时监测网站是否异常_网站监控劫持问题,怎么通过网站监控解决劫持问题...
  7. Common Lisp中调用R
  8. 可视化大屏设计尺寸_可视化大屏设计_酷炫不是最高效的大屏展示的唯一标准...
  9. .NET 类型(Types)的那些事
  10. Java对象容器——List
  11. 使用easyUI给datagrid添加pagination
  12. 微型计算机硬件性能取决于什么,微型计算机硬件系统的性能主要取决于
  13. popupmenu java_Java基于JPopupMenu实现系统托盘的弹出菜单,解决PopupMenu弹出菜单中文乱码...
  14. 动态调用object php,PHP动态调用,大家都来谈吧
  15. python matplotlib 绘制三次函数图像
  16. 利用子查询解决复杂sql问题
  17. Python基础(十): 函数的基本概念
  18. Java伪装csrss_csrss.exe是什么进程,是病毒吗?
  19. Qt QTableView详解
  20. 面试官:Java的重写和重载有什么区别?

热门文章

  1. Numba——python面向数组高性能计算库
  2. 通过jquery的serializearray处理表单数据成json格式,并提交到后台处理
  3. OpenStack 架构图
  4. OpenCV 静态链接 libstdc++
  5. Outlook2013/2016去掉正文中的换行符
  6. HibernateTemplate
  7. linux 线程与CPU绑定
  8. Linux memcached 安装
  9. zBrow压力测试图
  10. s:select 使用