【问题标题】:Does protocol buffer handle nicely end of data on stream协议缓冲区是否很好地处理流数据的结束
【发布时间】:2017-11-05 23:25:40
【问题描述】:

我在 c#、.net core 2 和协议缓冲区方面完全是新手,但我必须使用这 3 种技术来完成个人项目(服务器/客户端架构)。我对多条消息中的序列化/反序列化有一些疑问。 我已经看到了: https://developers.google.com/protocol-buffers/docs/techniques#streaming 所以我知道这需要一种特殊的技术。在进行了一些谷歌会话之后,我发现了一些关于 c++ 中的 put 和 pop 限制的信息,但我还没有看到 c# 上的文档。

我还有一个问题,谷歌协议缓冲区是否处理得很好?我的套接字是用 select 监控的,所以当我想阅读我的消息时(使用https://developers.google.com/protocol-buffers/docs/reference/csharp/class/google/protobuf/message-parser#class_google_1_1_protobuf_1_1_message_parser_1a110e5d9bc61837e369e5deb093f59161) 我不确定 protobuf 将如何停止读取(我不想读取套接字上可用的数据,因为它会使我的服务器阻塞......) 它管理它吗?谢谢...

【问题讨论】:

标签: networking error-handling protocol-buffers blocking nonblocking


【解决方案1】:

独立的 protobuf 不以任何方式分隔 - 它们不对其长度进行编码,也没有固定的开始或结束。

但 API 为您提供了一些用于发送和存储多条消息的工具 - 具体而言,您可以使用 WriteDelimitedTo() 将多个 protobufs 写入某些输出,然后使用 parseDelimitedFrom() 读取它们

【讨论】:

  • 感谢您给我正确的方法来正确写入数据长度。但是我必须管理阅读部分吗?如果 Sockets.Select () 告诉我“可以从这个套接字读取”,然后我尝试 parsedDelimitedFrom() 它将读取多少?超过套接字上可用的数据?
  • 阅读文档。它说“流应该包含一个长度,然后是数据。只有长度指定的数据量才会被消耗。”所以 WriteDelimitedTo 在 protobuf 前面加上它的长度,parseDelimitedFrom 读取正确的字节数。
  • 是的,这毕竟是我看到的。我想我需要找到一种方法来确定在 parseDelimitedFrom 之前套接字上是否有足够的数据...谢谢。
猜你喜欢
  • 2010-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-18
  • 2012-01-21
  • 2014-09-13
相关资源
最近更新 更多