无法解析0MQ套接字中收到的Jsoncpp对象

时间:2019-01-04 20:12:27

标签: c++ protocol-buffers zeromq jsoncpp

我正在用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 :(得分:0)

您正在使用Json::Value输出对象的大小作为通过套接字发送的大小。这是不正确的,您需要使用新创建的字符串的大小。

将代码更改为:

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