如何将大字符串写入NetworkStream?

时间:2010-07-27 07:13:06

标签: c# sockets networkstream

从互联网上我找到了从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的示例。

我们的阅读是否有“对称”的写作模式?

提前谢谢。

1 个答案:

答案 0 :(得分:5)

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

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

我强烈建议您将NetworkStream包裹在StreamReader中以供阅读,并StreamWriter进行书写。这就是他们的目的。然后,您可以一次读取一行,或只读取char[]缓冲区,或者读取流的末尾(这意味着“直到套接字关闭”)。这适用于纯文本协议。

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

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