我正在用c ++构建服务器和客户端,这些服务器和客户端使用ZeroMQ PAIR套接字进行通信。由于我想从客户端到服务器调用一些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;
}
server.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是否还有其他更好的方法?
答案 0 :(得分:0)
您正在使用Json::Value
输出对象的大小作为通过套接字发送的大小。这是不正确的,您需要使用新创建的字符串的大小。
将代码更改为:
std::string str = Json::writeString(builder, out);
zmq::message_t request(str.c_str(), str.size());
socket.send (request);