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

标签 c++ protocol-buffers zeromq jsoncpp

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

将代码更改为:

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

关于c++ - 无法解析在 0MQ 套接字中接收到的 Jsoncpp 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54045421/

相关文章:

c++ - 带有常规文件的 System.AccessViolationException

php - 与 PHP 通信 ATL COM dll

c++ - 初始化双击MFC中的编辑控件

c# - 如何说服GetProto吐出proto3格式

python - ZeroMQ收不到消息怎么办?

sockets - ZeroMQ:如何将消息发送到特定的订户

c++ - 在 C++ 控制台应用程序中使用 Unicode 字体

android - 协议(protocol)设计

c# - Google Protocol Buffers - protobuf-net 反序列化无法正常工作

amazon-web-services - AWS SNS 中的延迟和吞吐量是否足以取代用于发布/订阅的专用 MQ?