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

Not able to parse Jsoncpp object received in 0MQ socket

本文关键字:Jsoncpp 对象 套接字 0MQ      更新时间:2023-10-16

我正在用 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 out 对象的大小作为通过套接字发送的大小。这是不正确的,您需要使用新创建的字符串的大小。

将代码更改为:

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