使用juggle简化网络编程
常规的网络编程,在消息处理上大概会采用如下方式
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简化网络编程相关推荐
- Linux C++/Java/Web/OC Socket网络编程
一,Linux C++ Socket网络编程 1.什么是TCP/IP.UDP? TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制 ...
- python socket tcp客户端_python网络编程socketserver模块(实现TCP客户端/服务器)
摘录python核心编程 socketserver(python3.x版本重新命名)是标准库中的网络编程的高级模块.通过将创建网络客户端和服务器所必须的代码封装起来,简化了模板,为你提供了各种各样的类 ...
- Java基础篇:网络编程
文章目录 概述 通信要素之一:IP和端口号 通信要素之二:网络协议 TCP网络编程 UDP网络编程 URL编程 总结 概述 Java是 Internet 上的语言,它从语言级上提供了对网络应用程序的支 ...
- 完毕port(CompletionPort)具体解释 - 手把手教你玩转网络编程系列之三
手把手叫你玩转网络编程系列之三 完毕port(Completion Port)具体解释 ...
- Linux下网络编程
Linux下网络编程初步 Linux以其源代码公开闻名于世,并以其稳定性和可靠性雄霸操作系统领域,在网络应用技术方面使用得更加广泛.很久以来它就是Windows的重要对手之一.随着网络时代的来临,Li ...
- NIO详解(一):java网络编程IO总结(BIO、NIO、AIO)
1.基本概念 在Java网络通信中,最基本的概念就是Socket编程了.Socket又称"套接字" 向网络发出请求或者应答网络请求. Socket 和ServerSocket类库位 ...
- .net网络编程之一:Socket编程
在.net下进行网络编程其实也相对比较简单,因为在.net类库已经提供了大量封装好的类.在.net下网络编程比较底层的类是System.Net.Sockets.Socket类,这个类提供了丰富的方法和 ...
- python网络编程案例_Python 网络编程_python网络编程基础_python高级编程
Python 网络编程 Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的 ...
- 04.Java网络编程(转载)
1.网络编程 1.1计算机网络概述 网络编程的实质就是两个(或多个)设备(例如计算机)之间的数据传输. 按照计算机网络的定义,通过一定的物理设备将处于不同位置的计算机连接起来组成的网络,这个网络中包含 ...
最新文章
- C++标准库简介(转)
- Intellij IDEA就这样配置,快到飞起!
- 在Linux上分析硬件检测日志
- 专题 18 Inline Assembly(在C语言中嵌套使用汇编)
- JVM调优系列:(四)GC垃圾回收
- php 实时监测网站是否异常_网站监控劫持问题,怎么通过网站监控解决劫持问题...
- Common Lisp中调用R
- 可视化大屏设计尺寸_可视化大屏设计_酷炫不是最高效的大屏展示的唯一标准...
- .NET 类型(Types)的那些事
- Java对象容器——List
- 使用easyUI给datagrid添加pagination
- 微型计算机硬件性能取决于什么,微型计算机硬件系统的性能主要取决于
- popupmenu java_Java基于JPopupMenu实现系统托盘的弹出菜单,解决PopupMenu弹出菜单中文乱码...
- 动态调用object php,PHP动态调用,大家都来谈吧
- python matplotlib 绘制三次函数图像
- 利用子查询解决复杂sql问题
- Python基础(十): 函数的基本概念
- Java伪装csrss_csrss.exe是什么进程,是病毒吗?
- Qt QTableView详解
- 面试官:Java的重写和重载有什么区别?