tcp接收数据中断

tcp接收数据中断,tcp,protocol-buffers,Tcp,Protocol Buffers,情况是:我有一个TCP服务器写的是c,TCP客户端android应用在Java中,使用google protobuf进行序列化/反序列化;服务器每秒向客户端发送数据进行显示。数据包含简单的attribute1/attribute2/attribute3,客户端需要使用attribute1/attribute2/attribute3显示准确的数据。数据大小超过1480字节,并且每秒都在变化 问题是:TCP客户端不会偶尔获得要显示的确切数据;例如,attribute3是一个字符串,即2018-12-

情况是:我有一个TCP服务器写的是c,TCP客户端android应用在Java中,使用google protobuf进行序列化/反序列化;服务器每秒向客户端发送数据进行显示。数据包含简单的attribute1/attribute2/attribute3,客户端需要使用attribute1/attribute2/attribute3显示准确的数据。数据大小超过1480字节,并且每秒都在变化

问题是:TCP客户端不会偶尔获得要显示的确切数据;例如,attribute3是一个字符串,即2018-12-10 12:00:00,但TCP客户端仅显示2018-12-


尝试:tcp服务器和客户端不能保证数据大小,因为来自服务器的数据每秒都在变化;而且它似乎没有提供谷歌protobuf发送的消息的长度。那么,tcp客户机如何获得要显示的准确数据呢?谢谢你的帮助

您需要决定通过TCP连接使用的消息格式,并在代码中实现该消息格式。TCP不是消息协议,协议缓冲区生成消息

一种常见的技术是在每条消息前面加上一个四字节整数,以网络字节顺序指示消息的大小。然后,接收器可以读取这四个字节,并知道协议缓冲区消息的字节数


有关更多信息,请参阅。

显示相关代码。David的回答绝对正确,但为了帮助调查:这种技术通常称为框架,每一条连续消息的标题都是答案的framethx,正如链接所指出的:解决此问题的最简单方法是在编写消息之前先编写每条消息的大小,但在编写消息之前,我不知道消息本身的确切大小。我可以通过call message.ByteSize获取消息的大小。所以我决定在消息中添加一个四字节的整数成员,表示消息的长度,但是protobuf使获取消息大小变得有点困难。@zbcwilliam您可以在缓冲区中保留四个字节作为大小,然后在这四个字节之后将消息写入缓冲区,然后用消息大小填充四个字节,然后发送整个消息。