我正在尝试从C++和Java中的文件读取/写入多个Protocol Buffers消息.谷歌建议在消息之前写长度前缀,但默认情况下没办法(我可以看到).
但是,2.1.0版中的Java API收到了一组"Delimited"I/O函数,显然可以完成这项工作:
parseDelimitedFrom
mergeDelimitedFrom
writeDelimitedTo
Run Code Online (Sandbox Code Playgroud)
有C++等价物吗?如果没有,那么Java API附加的大小前缀是什么,所以我可以用C++解析这些消息?
这些现在存在于google/protobuf/util/delimited_message_util.hv3.3.0中.
我可以成功运行gRPC client,并gRPC server在c++现在我希望建立节点A和GRPC服务器即之间的通信node B的连接形象.
我可以参考下面的任何例子是我正在寻找的.
我有这个节点A带http消息(GET方法)我需要解析,即提取消息并在节点C上运行请求.我应该在节点A和gRPC服务器之间寻找什么.
提前致谢
我试图使用Google的Protocol Buffers和boost :: asio在C++中一起破解客户端.
我的问题是我不知道如何将protobuf消息提供给asio.我有的是这个:
// set up *sock - works
PlayerInfo info;
info.set_name(name);
// other stuff
Run Code Online (Sandbox Code Playgroud)
现在我知道以下是错误的,但我会发布它:
size_t request_length = info.ByteSize();
boost::asio::write(*sock, boost::asio::buffer(info, request_length));
Run Code Online (Sandbox Code Playgroud)
我知道我必须以不同的方式将我的信息打包到缓冲区 - 但是如何?
一般来说,我很难搞清楚boost :: asio是如何工作的.有一些教程,但它们通常只包括发送标准数据格式,如ints,它是开箱即用的.我认为我的问题是序列化,但另一方面我了解到protobuf应该为我做这个......现在我很困惑;)
谢谢你的帮助!
- > Daniel Gehriger提供了解决方案,非常感谢!
我正在使用Boost asio编写一个应用程序,其中客户端和服务器交换使用google proto-buffers序列化的消息.我不知道通过网络发送的序列化消息的大小是多少.似乎proto-buf对象没有任何分隔符.
以下是.proto文件的内容.
package tutorial;
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
}
Run Code Online (Sandbox Code Playgroud)
这是我从服务器写的方式
tutorial::Person p;
p.set_name("abcd pqrs");
p.set_id(123456);
p.set_email("abcdpqrs@gmail.com");
write(p);
boost::asio::streambuf b;
std::ostream os(&b);
p.SerializeToOstream(&os);
boost::asio::async_write(socket_, b,
boost::bind(&Server::handle_write, this,
boost::asio::placeholders::error));
Run Code Online (Sandbox Code Playgroud)
在客户端我正在使用boost :: asio :: async_read读取上面发送的消息.如何在下面的代码中找出arg要设置为参数的值boost::asio::transfer_at_least?
boost::asio::async_read(socket_, response_,
boost::asio::transfer_at_least(arg),
boost::bind(&Client::handle_read_header, this,
boost::asio::placeholders::error));
Run Code Online (Sandbox Code Playgroud)
或者,如何在读取整个对象后确保boost :: async_read返回?