我正在使用TCP为给定协议编写网络客户端,并且我对该事物的整体架构存在一些哲学问题。 有时可能会发生我没有完整的请求数据,我可能需要读取比目前可用的更多的字节,我想有时候我可以获得另一个请求的部分内容。一个我想要的。在这种情况下,通常的做法是什么?
答案 0 :(得分:1)
TCP套接字是面向流的。这意味着读取它们与读取文件相同。如果要通过TCP传递离散消息,则需要将数据流拆分为消息,就像换行符将文本文件拆分为行一样。这称为框架。
有很多方法可以做到这一点,这里有一些例子:
计数方法 - 每条消息都以其长度为前缀。说“5apple”。您首先读取“5”,然后您知道此消息中有多少字节,并且第6个字节将是下一条消息的第一个字节。如果您的某些消息很长,则可能需要几个长度字节。
分隔符方法 - 有一个特殊字符(比如null)表示一条消息的结束和下一条消息的开始。然后只需从套接字读取,直到达到此分隔符。但请注意,您必须确保此字符永远不会出现在您的邮件中,因为这样会搞砸所有内容。
固定大小的消息 - 与第一种方法类似,只是长度字段是隐式的。确保所有消息都具有固定长度(如果需要,使用填充),然后每次只读取套接字中正确的字节数。