我需要使用C#在TCP套接字连接上发送多条消息吗? 如果是的话,该怎么做?
答案 0 :(得分:5)
TCP套接字只是一个流;你只是继续写信。我怀疑这里的问题是如何将这样的流分解为谨慎的消息 - 因为您需要在流中添加某种逻辑框架。显然, 无法 执行的操作是“直到您到达流的末尾才会读取”,因为不适用在同一个套接字上发送多条消息。
对于基于文本的消息,这通常意味着“编写每条消息后跟换行符作为分隔符”(和“读取直到获得换行符”)。对于二进制文件,它几乎总是以某种方式采用长度前缀的形式。例如,一个简单的协议可能在每个消息之前包含4个字节,作为后续消息长度的小端32位整数表示,因此在写入时它是“写入长度,写入有效负载” - 并在读取时是“读取长度,读取多个字节,处理该消息”(注意:4字节不一定是这样做的好方法,因为它无法处理非常大的有效负载 - 这是否是一个问题取决于你的数据想发送。)
在这两种情况下,由于 network 数据包与您调用Write
/ Send
的次数无关,因此您的阅读代码需要缓冲和循环。
另请参阅http://marcgravell.blogspot.com/2013/02/how-many-ways-can-you-mess-up-io.html,其中对此主题有更多想法。