代码之家  ›  专栏  ›  技术社区  ›  pere57

NetworkStream上的BinaryReader和BinaryWriter

  •  5
  • pere57  · 技术社区  · 6 年前

    是否可以对相同的底层NetworkStream同时使用BinaryReader和BinaryWriter

    1. 使用单线程顺序交错读写?
    2. 使用1个线程进行读取,1个线程进行写入?

    (我的目标是通过TcpClient连接同时发送和接收数据)

    到目前为止,我遇到了两个相关的帖子:

    One 参考 NetworkStream docs :

    可以在NetworkStream类的实例上同时执行读写操作,而无需同步。只要写操作有一个唯一的线程,读操作有一个唯一的线程,读线程和写线程之间就不会有交叉干扰,也不需要同步。

    这个 second 参考 BinaryReader docs :

    在读取或使用BinaryReader时使用底层流可能会导致数据丢失和损坏。例如,同一字节可能被多次读取,字节可能被跳过,或者字符读取可能变得不可预测。

    我不能百分之百确定如何解释这些引语,我也不确定我上面的两个案例中哪一个是可能的(如果有的话)。

    1 回复  |  直到 6 年前
        1
  •  7
  •   Marc Gravell    6 年前

    “是”是简短的回答;一 NetworkStream 本质上起到双工流的作用,读操作与写操作完全分离。A. BinaryReader 将仅使用读取操作,并且 BinaryWriter 写入操作。概念,如 Length ,则, Position Seek 在上没有意义 网络流 不支持和。因此:使用 二进制读取器 / 二进制编写器 。然而,同时我可能会建议 反对 使用它们-仅仅是因为它们与使用raw相比实际上没有添加太多 Stream 操作,并且与任意网络协议不兼容。如果您正在实现一些只使用您的代码的自定义内容:当然,您可能会很好。

    关于触摸的警告 流动 使用时 二进制读取器 / 二进制编写器 仍然非常适用于一些 另外 溪流- FileStream 例如:您可以通过在读写器认为流是负责的情况下重新定位流来损坏数据,因为只有一个位置:这意味着读会影响写,等等。但是:这根本不适用于 网络流 。在这方面: 网络流 是例外,而不是规则:就你通常期望的 流动 ,则, 网络流 这很不寻常。