2014年01月28日 星期二 11:34
cxxtools是一组内容非常丰富的C++ Library,包含了json rpc的服务端和客户端的实现。
json rpc并没有约束底层传输协议,传输层可以是http,也可以是raw tcp socket,很明显,后者由于协议开销小,运行效率会更高。
如下代码示例演示了使用cxxtools开发json rpc over raw tcp socket的用法。
Person.h
#include <string>
#include <vector>
#include <cxxtools/serializationinfo.h>
struct Person {
int age;
std::string name;
std::vector<std::string> emails;
};
inline void operator <<=
(cxxtools::SerializationInfo &si, const Person & p) {
si.addMember("age") <<= p.age;
si.addMember("name") <<= p.name;
si.addMember("emails") <<= p.emails;
}
inline void operator >>=
(const cxxtools::SerializationInfo &si,Person &p) {
si.getMember("age") >>= p.age;
si.getMember("name") >>= p.name;
si.getMember("emails") >>= p.emails;
}
jsonrpcserver.cpp
#include <iostream>
#include <vector>
#include <map>
#include <cxxtools/eventloop.h>
#include <cxxtools/json/rpcserver.h>
#include <cxxtools/serializationinfo.h>
#include "Person.h"
using namespace std;
using namespace cxxtools;
class calc {
public:
calc() {};
~calc() {};
static int sum(int a,int b) {
return a+b;
}
static int sub(int a,int b) {
return a-b;
}
static int sum_all(vector<int> v) {
int result=0;
for(unsigned int i=0;i<v.size();i++) {
result += v[i];
}
return result;
}
static int sum_kv(map<string,int> m) {
int result=0;
map<string,int>::iterator it;
for(it=m.begin();it!=m.end();it++) {
result += it->second;
}
return result;
}
static int sum_age(Person p1,Person p2) {
return p1.age + p2.age;
}
static int sum_all_age(vector<Person> vp) {
int result=0;
for(unsigned int i=0;i<vp.size();i++) {
result += vp[i].age;
}
return result;
}
};
int main(int argc,char **argv) {
try {
EventLoop loop;
json::RpcServer srv(loop,9999);
srv.registerFunction("calc_sum",calc::sum);
srv.registerFunction("calc_sub",calc::sub);
srv.registerFunction("calc_sum_all",calc::sum_all);
srv.registerFunction("calc_sum_kv",calc::sum_kv);
srv.registerFunction("calc_sum_age",calc::sum_age);
srv.registerFunction("calc_sum_all_age",calc::sum_all_age);
loop.run();
} catch (const exception &e) {
cout << "ERROR: " << e.what() << endl;
}
return 0;
}
jsonrpcclient.cpp
#include <iostream>
#include <cxxtools/json/rpcclient.h>
#include <cxxtools/remoteprocedure.h>
#include <vector>
#include <map>
#include "Person.h"
using namespace std;
using namespace cxxtools;
int main(int argc,char **argv) {
try {
json::RpcClient cli("10.1.1.161",9999);
RemoteProcedure<int,int,int>
calc_sum(cli,"calc_sum");
RemoteProcedure<int,int,int>
calc_sub(cli,"calc_sub");
RemoteProcedure<int,vector<int> >
calc_sum_all(cli,"calc_sum_all");
RemoteProcedure<int,map<string,int> >
calc_sum_kv(cli,"calc_sum_kv");
RemoteProcedure<int,Person,Person >
calc_sum_age(cli,"calc_sum_age");
RemoteProcedure<int,vector<Person> >
calc_sum_all_age(cli,"calc_sum_all_age");
/*
for(int i=0;i<10000;i++) {
if(i % 1000 == 0) {
cout << i << endl;
}
calc_sum(100,200);
calc_sub(200,100);
}
*/
cout << "100 + 200 = " << calc_sum(100,200) << endl;
cout << "100 - 90 = " << calc_sub(100,90) << endl;
vector<int> v;
for(int i=1;i<=100;i++) {
v.push_back(i);
}
cout << "1 + 2 + ... + 100 = " << calc_sum_all(v) << endl;
map<string,int> m;
m["mengguang"]=100;
m["mengkang"]=200;
cout << "sum of kv: " << calc_sum_kv(m) << endl;
Person p1;
p1.age=30;
p1.name="mengguang";
p1.emails.push_back("mengguang@gmail.com");
p1.emails.push_back("xmgu2008@163.com");
Person p2;
p2.age=32;
p2.name="mengkang";
p2.emails.push_back("mengkang@gmail.com");
p2.emails.push_back("mk2014@163.com");
cout << "sum age: " << calc_sum_age(p1,p2) << endl;
vector<Person> vp;
vp.push_back(p1);
vp.push_back(p2);
cout << "sum all age: " << calc_sum_all_age(vp) << endl;
} catch (const exception &e) {
cout << "ERROR: " << e.what() << endl;
}
return 0;
}
参考资料:
Zeuux © 2025
京ICP备05028076号