【问题标题】:Pros/Cons of Stream[Reader/Writer]流的优点/缺点[阅读器/编写器]
【发布时间】:2012-04-03 17:21:36
【问题描述】:

所以有一段时间我一直在使用 StreamReader/Writer 作为 TcpClient 的 NetworkStream 的包装器 - 主要是为了简单和节省时间。

在连接的两端使用流读取器/写入器时效果很好,但我注意到,当使用这些辅助类之一的端点不使用辅助对应时,奇怪的事情开始发生。流中附加的多余字节和其他奇怪的东西。

这让我想到,使用这些包装器可能会有一些不必要的开销?或者在使用 C++ 或 PHP 等其他语言开发客户端时可能存在兼容性问题。

使用 StreamReader 和 StreamWriter 辅助类有什么含义,有什么好处吗? (沿着错误处理或其他任何方式)

【问题讨论】:

  • 文本读取器和写入器倾向于进行缓冲读取和写入。请参阅有关此行为的文档。
  • 当你掌握了协议规范,主要是编码,那些“奇怪的东西”就会消失。

标签: c# networking networkstream


【解决方案1】:

StreamReader/Writer 让您可以轻松地在流中存储/读取文本数据。除了它们的用途之外,没有额外的开销 - 以正确的编码将值转换为文本表示。只要双方同意编码,使用其他语言的文本流应该没有问题 - 即一个是带有 BOM 的默认 UTF-8。

“Extraneous bytes prepended”为Byte Order Mark (BOM),在构建阅读器时可以关闭(仅适用于Unicode UTF-8/7/16编码)。

根据您的目标,使用原始流进行二进制通信可能会更好/更快。

【讨论】:

    【解决方案2】:

    我假设您正在使用 ReadLine 和 WriteLine 并看到不一致的结果。

    首先,StreamReader 假定 UTF-8 字符,这可能不是从另一端发送的内容。您可以在创建 StreamReader 时设置编码。

    其次,StreamReader假设行以\n、\r或\r\n结尾,这意味着如果另一端发送一个换行符为\n\r就会引起奇怪。

    第三,是的,StreamReader 有一些开销,因为它必须缓冲输入以查找换行符。但如果没有这个,在找到新行之前就更难了。

    【讨论】:

    • 我正在使用 Read、ReadBlock 和 Write
    • StreamReader/Writer 在 UTF8 上不固定
    • @HenkHolterman - 我没有说它是,我说它可以在构造函数中更改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    • 2016-11-04
    • 2010-11-03
    • 1970-01-01
    • 2011-10-11
    • 2010-09-06
    • 1970-01-01
    相关资源
    最近更新 更多