17
|
Jack Edmonds · 技术社区 · 15 年前 |
![]() |
1
36
不要只将序列化数据写入套接字。首先发送一个包含序列化对象长度的固定大小字段。 发送端大致是:
接收端变成了:
这是一种常见的套接字编程设计模式。大多数设计都扩展了线上结构以包含类型字段,因此您的接收端类似于:
您最终得到的是一个类似于以下格式的over-the-wire消息格式:
这对将来防止不可预见的需求的有线协议做了合理的工作。这是一个 Type-Length-Value 协议,您将在网络协议中一次又一次地找到它。 |
![]() |
2
4
为了扩展J.J.的(完全正确的)答案,Protobuf库 无路可走 计算消息本身的长度,或者计算发送的protobuf对象的类型*。所以发送数据的另一个应用程序肯定已经在做类似的事情了。 当我必须这样做时,我实现了一个查找表:
…基本上做了J.J.所做的,但我还有一个辅助功能:
…我调用它来将字符串转换为protobuf对象。 (*)我认为可以通过在容器消息中封装特定消息来绕过这一点。 |
![]() |
3
0
要考虑的另一个方面(尽管是在更简单的情况下)是您对单个消息使用单个TCP连接。在这种情况下,只要您知道期望的消息是什么(或使用 Union Types 要在运行时确定消息类型,可以使用tcp connection open作为“start”分隔符,使用connection close事件作为最终分隔符。这样做的好处是,您可以快速接收整个消息(而在其他情况下,TCP流可以保持一段时间,从而延迟接收整个消息)。如果这样做,就不需要任何显式带内帧,因为TCP连接的生存期充当帧本身。 |