我正在用 C++ 构建服务器和客户端,它们使用 ZeroMQ PAIR 套接字进行通信。由于我想从客户端调用一些 RPC 到服务器,我使用 JSON::Value 结构对函数名称和参数进行编码,以便服务器可以解析它并调用适当的函数。
我检查了 gRPC 是否做了同样的事情,但我觉得它太过分了,因为它需要太多的努力才能做到正确。
作为草稿,我创建了一个示例客户端和服务器应用程序。我能够将数据从客户端发送到服务器,但在服务器端我收到解析错误。谁能告诉我我可能做错了什么?
客户端.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 从客户端到服务器?
最佳答案
您正在使用 Json::Value
输出对象的大小作为通过套接字发送的大小。这是不正确的,您需要使用新创建的字符串的大小。
将代码更改为:
std::string str = Json::writeString(builder, out);
zmq::message_t request(str.c_str(), str.size());
socket.send (request);
关于c++ - 无法解析在 0MQ 套接字中接收到的 Jsoncpp 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54045421/