0

我想要一个用 C++ 编写的类作为远程过程调用服务器。

我有一个我解析的大(超过千兆字节)文件,读取参数以实例化对象,然后将其存储在 std::map 中。我希望 RPC 服务器监听来自客户端的调用,获取客户端传递的参数,在 map 中查找适当的值,进行计算,并将计算的值返回给客户端,我希望它服务并发请求——所以我想让多个线程监听。顺便说一句,地图填充后,它不会改变。请求只会从中读取。

我想用 Python 编写客户端。服务器可以只是一个监听 POST 请求的 HTTP 服务器,客户端可以使用 urllib 发送它们吗?

我是 C++ 新手,所以我不知道如何编写服务器。谁能指点我一些例子?

4

2 回答 2

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 或啜)。

这是 Python 中使用的同一台服务器bjsonrpc

import bjsonrpc

class Service(bjsonrpc.handlers.BaseHandler):
    def echo(self, *args):
        return {'params': args}

server = bjsonrpc.createserver(handler_factory = Service)
server.serve()
于 2013-07-17T22:53:21.853 回答
0

也许因素会影响选择。

一种解决方案是使用 fastcgi。

客户端向启用了 fastCGI 的 HTTP 服务器发送 HTTP 请求。HTP 服务器通过 fastcgi 机制将请求发送到您的 RPC 服务器。RPC 服务器处理并生成响应,并发送回 http 服务器。http 服务器将响应发送回您的客户端。

于 2013-07-17T22:01:07.880 回答