使用juggle简化网络编程
常规的网络编程,在消息处理上大概会采用如下方式
- 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框架有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)[]))->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简化网络编程的更多相关文章
- VC++ 网络编程总结(一)
1.套接字编程原理 一个完整的网间通信进程需要由两个进程组成,并且只能用同一种高层协议.也就是说,不可能通信的一段用TCP,而另一端用UDP.一个完整的网络信息需要一个五元组来标识:协 ...
- [C# 网络编程系列]专题三:自定义Web服务器
转自:http://www.cnblogs.com/zhili/archive/2012/08/23/2652460.html 前言: 经过前面的专题中对网络层协议和HTTP协议的简单介绍相信大家对网 ...
- 猫哥网络编程系列:HTTP PEM 万能调试法
注:本文内容较长且细节较多,建议先收藏再阅读,原文将在 Github 上维护与更新. 在 HTTP 接口开发与调试过程中,我们经常遇到以下类似的问题: 为什么本地环境接口可以调用成功,但放到手机上就跑 ...
- C++11网络编程
Handy是一个简洁优雅的C++11网络库,适用于linux与Mac平台.十行代码即可完成一个完整的网络服务器. 下面是echo服务器的代码: #include <handy/handy.h&g ...
- python网络编程-socket编程
一.服务端和客户端 BS架构 (腾讯通软件:server+client) CS架构 (web网站) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二.OSI七层 ...
- python之Socket网络编程
什么是网络? 网络是由节点和连线构成,表示诸多对象及其相互联系.在数学上,网络是一种图,一般认为专指加权图.网络除了数学定义外,还有具体的物理含义,即网络是从某种相同类型的实际问题中抽象出来的模型.在 ...
- Python-socket网络编程
一.计算机网络 多台独立的计算机用网络通信设备连接起来的网络.实现资源共享和数据传递.比如,我们之前的学过的知识可以将D盘的一个文件传到C盘,但如果你想从你的电脑传一个文件到我的电脑上目前是做不到的; ...
- Python之路【第七篇】python基础 之socket网络编程
本篇文章大部分借鉴 http://www.cnblogs.com/nulige/p/6235531.html python socket 网络编程 一.服务端和客户端 BS架构 (腾讯通软件:ser ...
- 【深入浅出Linux网络编程】 “实践 -- TCP & UDP”
通过上一篇博客的学习,你应该对基于epoll的事件触发机制有所掌握,并且通过阅读sio.c/sio.h应该也学会了如何封装epoll以及如何通过设计令epoll更加实用(用户回调,用户参数). 简单回 ...
随机推荐
- 学习MVC之租房网站(八)- 前台注册和登录
在上一篇<学习MVC之租房网站(七)-房源管理和配图上传>完成了在后台新增.编辑房源信息以及上传房源配图的功能.到此后台开发便告一段落了,开始实现前台的功能,也是从用户的登录.注册开始. ...
- 读Zepto源码之集合操作
接下来几个篇章,都会解读 zepto 中的跟 dom 相关的方法,也即源码 $.fn 对象中的方法. 读Zepto源码系列文章已经放到了github上,欢迎star: reading-zepto 源码 ...
- JavaScript性能优化 DOM编程
最近在研读<高性能JavaScript>,在此做些简单记录.示例代码可在此处查看到. 一.DOM 1)DOM和JavaScript 文档对象模型(DOM)是一个独立于语言的,用于操作XML ...
- 关于QT按键信号槽的总结(原创)
QT界面按钮一般是必填的: 每个按钮都要 Go to slot 下面有几个都是常用的,先说一下 clicked:pressed:releaed的区别 字面意思看:click是点击一下,pressed是 ...
- (原创)foef注意事项
原创内容,转载请标明原文地址 我们先来看下下面的代码 //获取文件大小 DWORD Get_File_Size(const char* m_FilePath) { unsigned long size ...
- C语言之运算符和条件结构
表达式:是有操作数和运算符组成的. 操作数:常量.变量.子表达式 X=(x+2)*(y-2); 运算符: 赋值运算符:= .其作用是做赋值运算,将等号后边的值赋值给等号前边的. 复合赋值运算符: += ...
- window.opener的用法
window.opener 主要用来打开窗体的父窗体,可以通过这种方式设置父窗体的值或者调用js方法. 例如: 1,window.opener.test(); ---调用父窗体中的test()方法 2 ...
- 这是假的JS——利用CSS Animation实现banner图非交互循环播放
话不多说,先来张html和css代码截图~ 注意事项: 1.如果想在每张图前进行停顿,可以在keyframes中的每一步前加上一小段与下一张相同的代码: 2.如果想要在实现无违和感的最后一张与第一张的 ...
- (转)Java 读写Properties配置文件
原文:http://www.cnblogs.com/xudong-bupt/p/3758136.html 1.Properties类与Properties配置文件 Properties类继承自Hash ...
- chrome调试技巧
1.开始调试:右键审查元素 2.按钮功能: 调出控制台: 切换开发环境全屏还是嵌入: 清空当前显示: 将压缩 js 文件格式化缩进规整的文件: 3.常用页面功能: 查看.编辑(双击)HTML: 查看选 ...