问题描述
|
我编写了一个使用以下内容的多线程简单服务器:
clientStream.Read(message,4096);
在客户端发送消息之前进行阻止。然后,代码继续处理该消息。
到目前为止,我只用它来发送短命令
ex. \"#login[username][login]\"
但是我担心当我通过该行发送巨大的表数据时,代码可能会在接收到所有代码之前继续执行。
那么.Read是否会阻塞直到接收到整个发送的消息,或者当任何数据开始接收时才取消阻塞?
解决方法
依靠“发送”完成以在消息之间进行描述是不好的形式。如果不是出于最简单的原因。我可以远程登录到您的服务器并轻松使其崩溃。
您需要创建一个有线协议。您有几种选择。
始终将消息的大小预期为前4个字节,为32位无符号整数,然后读取直到您填充了该数据量。
指定消息结尾定界符。这意味着您将维护一个缓冲区。您可以将数据离线填充,快速扫描消息末尾。找到消息后,将其扔给消息处理器,然后继续处理缓冲区中剩余的字节,重复步骤1。
您可以查看STOMP以获取基于文本的简单协议。
不要将您的数据包以定义良好的块作为消息定界符发送。