Не удалось проанализировать объект Jsoncpp, полученный в сокете 0MQ - PullRequest
0 голосов
/ 04 января 2019

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

1 Ответ

0 голосов
/ 25 января 2019

Вы используете размер объекта Json::Value out в качестве размера для отправки через сокет. Это неверно, вам нужно использовать размер вновь созданной строки.

Измените код на:

std::string str = Json::writeString(builder, out);
zmq::message_t request(str.c_str(), str.size());
socket.send (request);
...