c# - 如何在网络流中写入一个小间隙?

标签 c# server networkstream pause

我有一个服务器,它通过 NetworkStream 向接收器(或者我称之为客户端)发送不同大小的遥测数据。我的目标是最大速度,所以我希望延迟最小。频率不受控制,因此我想在客户端中使用无限循环,即使用 NetworkStream.Read 读取数据、处理数据,然后重复。

我的问题是,有时,如果两个数据包发送得非常快,而客户端的互联网连接速度很慢,则这两个数据包将作为连续流接收,从而导致无法处理的数据。我发现的一个半解决方案(主要是为了确认这确实是错误)是在每次传输之后/之前有一个小的延迟,使用 System.Threading.Thread.Sleep(100) ,但不是只是我发现 Sleep 是一个糟糕的解决方案,它不一致,因为它还会减慢连接良好的客户端的速度,并且在连接更差的情况下问题可能仍然存在。

我想做的是让服务器在每次传输之间发送一个间隙,无论互联网速度如何,都可以提供间隔,因为 NetworkStream.Read 应在当前连续流结束后完成。我不太了解 NetworkStream 的工作原理,也不知道几个字节的空流是什么样子或者如何实现它。有什么想法吗?

最佳答案

如果可以的话,我强烈建议您更改协议(protocol)。 TCP一种基于流的协议(protocol),任何有效忽略这一点的尝试都可能是不可靠的。

相反,我建议将其更改为消息流,其中每条消息都有一个前缀,指示消息正文的长度。这样,特定消息是否被拆分到多个数据包中或与其他消息在同一数据包中接收都无关紧要。它还使客户的阅读变得更容易:他们确切地知道要读取多少数据,因此可以在一个简单的循环中完成此操作。

如果您担心长度前缀会带来太多开销(如果数据通常很小),您可能会使用包含整批信息(多个遥测项目)的单个消息使协议(protocol)稍微复杂一些。

但从根本上讲,值得假设数据被分割成多个数据包,然后再次组合等。不要假设一个写入操作对应一个读取操作。

关于c# - 如何在网络流中写入一个小间隙?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50554445/

相关文章:

c# - 如何分隔二进制网络流中的消息?

c# - 如何从网址下载图片

c# - Visual Studio 2002 : C# freezes when sending file over TCP/IP

macos - MAC、MAMP、127.0.0.1 连接被拒绝,本地主机正常

javascript - Electron 构建应用程序无法启动 Express 服务器

c# - 全双工 Tcp 数据交换 c#

c# - 即使在将 DataGridView 标题设置为 MiddleCenter 后,标题也略微向左对齐

c# - 无法加载文件或程序集 Microsoft.Owin.Security.OAuth,版本 = 2.0.0.0

java - 我怎样才能安全地停止这个Java服务器程序?

c# - 复制流的最后 16 个字节以外的所有字节?流结束的早期检测?