如何将大字符串写入NetworkStream?

xpo*_*ort 0 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;
        }
 }
Run Code Online (Sandbox Code Playgroud)

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

是否有像写作一样的"对称"模式?

先感谢您.

Jon*_*eet 6

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

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

我强烈建议你把它包装成NetworkStream一个StreamReader用于阅读,一个StreamWriter用于写作.这就是他们的目的.然后,您可以一次读取一行,或者只读取char[]缓冲区,或者到流的末尾(这意味着"直到套接字关闭").这适用于纯文本协议.

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

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