【问题标题】:C# NetworkStream Write/Read vs Socket Send/Receive? [closed]C# NetworkStream 写入/读取与套接字发送/接收? [关闭]
【发布时间】:2020-12-24 11:43:10
【问题描述】:

哪一个比另一个快?我正在构建一个服务器客户端应用程序,但我不确定哪个更快。我可以顺利地发送和接收数据,但我想要更快的通信。

【问题讨论】:

  • 我相信 Socket 是一个更基本的实现,所以你开箱即用的东西更少,但我不知道你真的会有那么多问题,取决于你如何使用它,NetworkSteam 可能内置了更多优化。也许同时运行两者并使用计时器进行一些测试,看看什么最适合您。
  • 网络流稍慢,因为它在 TX 端获取 TCP 数据并放入流中,而 Rx 从流中移除。 TCP 最大传输块为 1500 字节。但是网络流消除了组合使用 TCP 时需要的块的操作。所以两者的速度是非常接近的。
  • 您可以放心地忽略@jdweng 的这个错误陈述:“网络流消除了组合块的操作”。所有Stream 对象,包括NetworkStream,都具有与TCP Socket 相同的面向流的行为,并且在所有情况下都没有自动“组合块”。无论您使用Socket 还是NetworkStream,您的代码都需要准备好接收从 1 字节到已发送但尚未接收的总字节数的任何位置,然后将接收到的字节重新组合成程序所需的任何有用排列.
  • 关于“哪个更快”的问题,您需要知道的一切都在这里:Which is faster?。事实是,计算机本身的运行速度比网络连接的速度要快几个数量级,所以只要你不完全搞砸代码,任何实现都会“足够快”。如果您“想要更快的通信”,请获得更快的网络连接。

标签: c# sockets networkstream


【解决方案1】:

NetworkStream 在内部使用套接字进行操作。你可以通过查看Microsoft documentation中它的构造函数来理解。

public NetworkStream (System.Net.Sockets.Socket socket);

它为您提供了可用于轻松读取/写入流的方法。

另一方面,Socket 类可让您更好地控制要在网络中交换的数据类型。如果您打算在网络中通过 TCP 协议交换数据,则使用 SocketNetworkStream 可能会发现传输速度没有差异。

如果您需要以更快的通信速度交换数据,请考虑使用 Socket 类使用 UDP 协议,但请记住,UDP 协议不像 TCP 那样面向连接,并且不会发生错误检查。因此,您无法确定您的数据的可靠性和数据的交付保证。

【讨论】:

    猜你喜欢
    • 2013-11-27
    • 1970-01-01
    • 2014-07-21
    • 1970-01-01
    • 2011-07-16
    • 2018-02-15
    • 2017-07-22
    • 2013-04-01
    • 1970-01-01
    相关资源
    最近更新 更多