【发布时间】:2019-01-04 20:12:27
【问题描述】:
我正在使用 ZeroMQ PAIR 套接字进行通信的 C++ 中构建服务器和客户端。由于我想从客户端调用一些 RPC 到服务器,所以我使用 JSON::Value 结构对函数名称和参数进行编码,以便服务器可以对其进行解析并调用相应的函数。
我检查了 gRPC 是否做了同样的事情,但我觉得这有点矫枉过正,因为它需要付出太多努力才能做到正确。
作为草稿,我创建了一个示例客户端和服务器应用程序。我能够将数据从客户端发送到服务器,但在服务器端我收到解析错误。谁能建议我做错了什么?
client.cpp
#include <zmq.hpp>
#include <string>
#include <iostream>
#include <jsoncpp/json/value.h>
#include <jsoncpp/json/reader.h>
#include <jsoncpp/json/writer.h>
int main ()
{
// Prepare our context and socket
zmq::context_t context (1);
zmq::socket_t socket (context, ZMQ_PAIR);
/**
* Json object value parser
*/
Json::Value out;
Json::Value res;
Json::StreamWriterBuilder builder;
out["MESSAGE"] = "Anaconda";
out["NEWS"] = "Something is wrong";
std::cout << "Connecting to hello world server…" << std::endl;
socket.connect ("tcp://localhost:5555");
zmq::message_t request(out.size());
std::string str = Json::writeString(builder, out);
std::cout<<str<<std::endl;
memcpy (request.data(),&str, out.size());
socket.send (request);
// Get the reply.
zmq::message_t reply;
socket.recv (&reply);
return 0;
}
服务器.cpp
int main () {
// Prepare our context and socket
zmq::context_t context (1);
zmq::socket_t socket (context, ZMQ_PAIR);
socket.bind ("tcp://*:5555");
/**
* Json object value parser
*/
Json::Reader mReader = {};
Json::Value res;
while (true) {
zmq::message_t request;
// Wait for next request from client
socket.recv (&request);
std::string str = std::string(static_cast<char*>(request.data()), request.size());
std::cout <<str<<std::endl;
auto ok = mReader.parse(str, res);
if (!ok) {
std::cout <<"ConHash:: Error while parsing: %s "<< mReader.getFormattedErrorMessages().c_str() << std::endl;
return false;
} else {
std::cout<<"Successfully parsed !!" <<std::endl;
}
// Do some 'work'
}
return 0;
}
另外你能告诉我有没有其他更好的方法来进行从客户端到服务器的 RPC?
【问题讨论】:
-
BUMP !!!!!!!!!!
标签: c++ protocol-buffers zeromq jsoncpp