我希望有一个用C ++编写的类作为远程过程调用服务器。
我有一个大的(超过一千兆字节)文件,我解析,读取参数来实例化我然后存储在std :: map中的对象。我希望RPC服务器监听来自客户端的调用,获取从客户端传递的参数,在地图中查找适当的值,进行计算,并将计算出的值返回给客户端,我希望它能够服务并发请求 - 所以我想让多个线程监听。顺便说一下,填充地图后,它不会改变。请求只会从中读取。
我想用Python编写客户端。服务器可能只是一个侦听POST请求的HTTP服务器,而客户端可以使用urllib来发送它们吗?
我是C ++的新手,所以我不知道如何编写服务器。有人能指点我一些例子吗?
答案 0 :(得分:0)
也许因素会影响选择。
一种解决方案是使用fastcgi。
客户端向启用了fastCGI的HTTP服务器发送HTTP请求。 HTP服务器通过fastcgi机制将请求分派给您的RPC服务器。 RPC服务器进程并生成响应,并发送回http服务器。 http服务器将响应发送回您的客户端。
答案 1 :(得分:0)
如果你必须用C ++编写服务器,而你不知道怎么做,你肯定想要使用框架。
有很多选择,StackOverflow不是一个讨论不同选择意见的好地方。但举一个例子,JsonRpc-Cpp
允许您在大约10行代码中实现JSON-RPC(通过原始TCP或HTTP)服务器,并为您要公开的每个RPC添加一行样板。比从头编写服务器容易得多。
所以,这是一个示例服务器:
#include <cstdlib>
#include <jsonrpc.h>
class Service {
public:
bool echo(const Json::Value &root, Json::Value &response) {
response["jsonrpc"] = "2.0";
response["id"] = root["id"];
Json::Value result;
result["params"] = root["params"];
response["result"] = result;
return response;
}
}
int main(int argc, char *argv[]) {
int port = std::atoi(argv[1]); // add some error handling here...
Json::Rpc::TcpServer server("127.0.0.1", port);
Service service;
server.AddMethod(new Json::Rpc::RpcMethod<Service>(service,
&Service::echo, "echo");
server.Bind(); // add error handling again
server.Listen();
while(true) server.WaitMessage(1000);
}
但是,如果您使用Python编写服务器,或者使用WSGI Web服务器并使用Python编写服务,并使用Python调用C ++代码(无论是通过ctypes
还是通过使用Cython或SIP等方法构建包装器。
这是使用bjsonrpc
的Python中相同的服务器:
import bjsonrpc
class Service(bjsonrpc.handlers.BaseHandler):
def echo(self, *args):
return {'params': args}
server = bjsonrpc.createserver(handler_factory = Service)
server.serve()