0

从互联网上,我得到了从 NetworkStream 中读取一个巨大字符串的方法。

 static NetworkStream ns = null;
 static StringBuilder sb = null;
 static byte[] buffer = null;
 static int position = 0;
 //.......................................
 //other codes skipped for simplicity
 //....................................... 
 private static string Read()
 {
        if (ns.CanRead)
        {
            sb.Clear();
            position = 0;
            while (ns.DataAvailable)
            {
                position = ns.Read(buffer, 0, buffer.Length);
                sb.Append(Encoding.Unicode.GetString(buffer, 0, position));
            }

            return sb.ToString().Trim();
        }
        else
        {
            return null;
        }
 }

但是,我找不到如何将大字符串写入 NetworkStream 的示例。

有没有像我们阅读一样的“对称”写作模式?

先感谢您。

4

1 回答 1

6

阅读代码在很多方面都是危险的错误:

  • 通过以这种方式使用静态变量,它完全不适合多线程任务。(我希望这只是因为你简化了它......)
  • 它从不将变量初始化为非空值 - 再次,希望这不是真正的代码
  • 它使用该DataAvailable属性来决定何时应该“完成” - 这非常危险,因为这意味着如果数据包在流中延迟,您可以读取的数据量是预期的一半
  • Encoding.Unicode总是使用,这很少是编码的最佳选择
  • 它假定它将始终读取整数个字符。如果一个字符在读取之间拆分怎么办?这就是Encoder/Decoder类的用途......但无论如何你并不需要在这里使用它们 - 见下文。

我强烈建议您将NetworkStreama 包装在StreamReader阅读中,并将 a包装在StreamWriter写作中。这就是他们的目的。然后,您可以一次读取一行,或者只是一个char[]缓冲区,或者到流的末尾(这意味着“直到套接字关闭”)。这对于纯文本协议来说很好。

如果你有一个混合文本和二进制数据的协议,生活就会变得更加艰难。就我个人而言,我喜欢使用长度前缀消息的协议——这样你就可以读取你想要的数据,然后执行你想要的任何转换。

无论如何,我希望这种随机选择的想法会有所帮助……如果您需要更详细的帮助,请提供您正在使用的协议的详细信息。

于 2010-07-27T07:18:06.077 回答