TCP是
流动
协议,不是
小包裹
协议。有
绝对没有保证
您将获得与发送数据完全相同的数据块—所保证的是,您将获得正确顺序的字节(或失败或超时等)。您可以分别获取每个字节,或者一次获取14条消息。或介于两者之间的任何东西,包括一个接收中的一半消息,以及下一个接收中的另一半消息。在unicode(etc)的情况下,这也意味着可以在多个接收端拆分单个字符。
任何基于TCP的多消息协议都需要包含
框架
,也就是说,您可以通过某种方式知道每个单独消息的开始和结束位置。由于您使用的是基于文本的协议,一个常见的选项是使用CR、LF或CR+LF分隔逻辑消息,然后您的工作是缓冲数据,直到您有一个完整的消息为止,方法是查找行结尾。对于完整性:在二进制协议的情况下,通常使用某种表示有效负载中数据量的头作为有效负载的长度前缀,然后您只需要解析头、确定长度和缓冲区,直到您有那么多数据。
在具有文本协议且无挑战性可伸缩性问题的简单应用程序中,可以使用
StreamReader
(在
NetworkStream
)为你做那部分,然后用
ReadLine
或
ReadLineAsync
.不过,请注意,这在“真正的”服务器中是个坏主意(尤其是
阅读线
)-你不希望恶意的或有缺陷的客户端仅仅因为发送了几个字符就永远锁定一个线程
没有行尾
,然后没有发送任何其他…永远。当然,在一个严肃的服务器中,你不会在每个客户机上使用线程
无论如何
是的。