Я строю сервер и клиент в 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 от клиента к серверу?