TCPStream.Read会阻塞直到发送消息中收到所有数据吗?

时间:2011-06-12 13:16:57

标签: c# .net sockets tcp stream

我编写了一个多线程简单服务器,它使用:

clientStream.Read(message, 0, 4096);

阻止直到客户端发送消息。然后代码继续处理该消息。

到目前为止,我只是用它来发送短命令

ex. "#login[username][login]"

但我担心当我通过线路发送大量表格数据时,代码可能会在收到所有代码之前继续。

同样会。收到阻止,直到收到整个发送的消息,或者在任何数据开始接收时是否解锁?

1 个答案:

答案 0 :(得分:7)

依靠发送完成来描述消息是不好的形式。如果不是出于最简单的原因。我可以远程登录到您的服务器并轻松崩溃。

您需要创建一个有线协议。你有几个选择。

  • 总是希望将消息的大小视为无符号的32位整数作为前4个字节,然后读取,直到填满该数据量为止。

  • 指定消息结束分隔符。这意味着您将保留缓冲区。您可以通过线路填充数据,快速扫描它以查找消息。找到消息后,将其丢给消息处理器,然后继续使用缓冲区中的左侧字节,重复步骤1.

您可以查看STOMP以获得基于文本的简单协议。

不要依赖于以明确定义好的块发送的数据包作为消息分隔符。