无法解析在 0MQ 套接字中收到的 Jsoncpp 对象
Not able to parse Jsoncpp object received in 0MQ socket
我正在用 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);
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 将对象移动到std::shared_ptr
- 代理对象的常量正确性
- 无法解析在 0MQ 套接字中收到的 Jsoncpp 对象
- 如何使用C 中的JSONCPP解析器解析对象/数组
- JsonCpp:如何在 Json::Value 中获取 en 空对象
- JsonCpp - 当有一个 json::Value 对象时,我怎么知道它的键名?
- jsoncpp:按名称访问JSON对象,返回可变引用,如果未找到则不创建对象
- jsoncpp Json::LogicError,当我尝试解析一个对象时
- JSONCPP.通过匹配值查找数组中的对象
- JSONcpp遍历对象中的列表
- 更快的JsonCpp替代方案,允许复制/更改Json对象
- 如何使用jsonCpp查找JSON数据中的对象或数组的数量