rpc
远程过程调用,就是调用远程服务器上的方法,返回结果,将需要运行的函数或者进程放到远程服务器上去执行,降低本地服务的能耗。
安装thriftwindows下面直接下载可执行文件就行了 产生cpp文件 ./thrift-0.16.0.exe --gen cpp camera.idl.txt 产生nodejs文件 ./thrift-0.16.0.exe --gen js:node camera.idl.txt 这样nodejs 的定义和c++的定义声明都自动产生了
先要安装thrift npm install thrift --save
使用nodejs编写服务端
const thrift = require('thrift');
const cService = require('./gen-nodejs/CameraService.js');
const cameras = {};
const server = thrift.createServer(cService, {
addCamera: function (camera, result) {
cameras[camera.id] = camera
console.log("camera add:", camera, " current:", camera)
result(null)
},
getCamera: function (id, result) {
console.log("get:", id)
result(null, cameras[id])
}
});
server.listen(5600);
console.log('server start at 5600');
使用c++ 写一个客户端
#include
#include
#include
#include
#pragma comment(lib, “libthrift.lib”)
using namespace ::apache::thrift;
using namespace ::apache::thrift::protocol;
using namespace ::apache::thrift::transport;
using namespace ::apache::thrift::server;
using boost::shared_ptr;
#pragma comment(lib,“libthrift.lib”)//链接库文件
int main(int argc, char** argv) {
int port = 5600;
boost::shared_ptr socket(new TSocket(“127.0.0.1”, port));
boost::shared_ptr transport(new TBufferedTransport(socket));
boost::shared_ptr protocol(new TBinaryProtocol(transport));
Camera came;
came.id ="1001";
came.name ="D1 hik";
came.ssrc ="13200001";
try {
transport->open();
client.addCamera(came);
camera came = client.getCamera();
transport->close();
}
catch (TException& tx) {
printf("ERROR:%s\n", tx.what());
}
getchar();
return 0;
}
以上客户端代码为伪代码,读者自行根据生成的代码去做就行,nodejs和c++建立通道后就可以进行通信,如果不需要远程过程调用,只是消息通信,可以使用zeromq
使用zeromq 和buttonrpczeromq使用订阅发布的方式,比较简单
建立zeromq的buttonrpcbuttonrpc建立在zeromq基础之上
#include "buttonrpc.hpp"
#include
struct camera
{
string camera;
string name;
uint32_t ssrc;
}
unordered_map g_maps;
string camera_find(uint32_t cameraid){
return g_maps[cameraid];
}
int main()
{
buttonrpc server;
server.as_server(6000);
server.bind("camera_find", camera_find);
server.run();
return 0;
}
#include
#include "buttonrpc.hpp"
int main()
{
buttonrpc client;
client.as_client("127.0.0.1", 6000);
camera a = client.call("camera_find", 2, 3);
std::cout
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?