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

Adr*_*ley 4 .net c# sockets tcp stream

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

clientStream.Read(message, 0, 4096);
Run Code Online (Sandbox Code Playgroud)

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

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

ex. "#login[username][login]"
Run Code Online (Sandbox Code Playgroud)

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

所以.Read阻止直到收到整个发送的消息,或者当任何数据开始接收时它是否解锁?

And*_*ell 7

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

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

  • 始终期望消息的大小为无符号32位整数作为前4个字节,然后读取,直到填充了该数据量.

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

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

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