Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将一个巨大的字符串写入NetworkStream?_C#_Sockets_Networkstream - Fatal编程技术网

C# 如何将一个巨大的字符串写入NetworkStream?

C# 如何将一个巨大的字符串写入NetworkStream?,c#,sockets,networkstream,C#,Sockets,Networkstream,从互联网上,我学会了从网络流中读取巨大字符串的方法 static NetworkStream ns = null; static StringBuilder sb = null; static byte[] buffer = null; static int position = 0; //....................................... //other codes skipped for simplicity //..................

从互联网上,我学会了从网络流中读取巨大字符串的方法

 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写入巨大字符串的示例

写作是否有一种“对称”的模式,就像我们阅读一样


提前谢谢。

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

  • 通过以这种方式使用静态变量,它完全不适合多线程任务。(我希望这只是因为你简化了它…)
  • 它从不将变量初始化为非空值——同样,希望这不是真正的代码
  • 它使用
    DataAvailable
    属性来决定何时“完成”——这是非常危险的,因为这意味着如果数据包在流中延迟,您可以读取预期数据量的一半
  • 它总是使用
    编码。Unicode
    编码很少是最好的编码选择
  • 它假定它将始终读取整数个字符。如果在两次读取之间拆分一个字符,该怎么办?这就是
    编码器
    /
    解码器
    类的用途。。。但是你不需要在这里使用它们——见下文
我强烈建议您将
NetworkStream
包装在
StreamReader
中进行阅读,将
StreamWriter
包装在
StreamWriter中进行写作。这就是他们的目的。然后,您可以一次读取一行,或者只读取一个
char[]
缓冲区,或者读取到流的末尾(这意味着“直到套接字关闭”)。这对于纯文本协议很好

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


不管怎样,我希望这些随机选择的想法能帮助。。。如果您需要更详细的帮助,请提供您正在使用的协议的详细信息。

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

  • 通过以这种方式使用静态变量,它完全不适合多线程任务。(我希望这只是因为你简化了它…)
  • 它从不将变量初始化为非空值——同样,希望这不是真正的代码
  • 它使用
    DataAvailable
    属性来决定何时“完成”——这是非常危险的,因为这意味着如果数据包在流中延迟,您可以读取预期数据量的一半
  • 它总是使用
    编码。Unicode
    编码很少是最好的编码选择
  • 它假定它将始终读取整数个字符。如果在两次读取之间拆分一个字符,该怎么办?这就是
    编码器
    /
    解码器
    类的用途。。。但是你不需要在这里使用它们——见下文
我强烈建议您将
NetworkStream
包装在
StreamReader
中进行阅读,将
StreamWriter
包装在
StreamWriter中进行写作。这就是他们的目的。然后,您可以一次读取一行,或者只读取一个
char[]
缓冲区,或者读取到流的末尾(这意味着“直到套接字关闭”)。这对于纯文本协议很好

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


不管怎样,我希望这些随机选择的想法能帮助。。。如果您需要更详细的帮助,请提供您正在使用的协议的详细信息。

感谢Jon Skeet的宝贵意见。坦白地说,我是编程界的新手。*)我使用静态字段是因为这些字段位于一个静态类中,可以准确地实例化单个对象。该对象将充当侦听多个客户端的服务器代理。*)在静态ctor中,我将分配所有空字段。*)你是对的。对于短字符串数据,我可以读取整个数据。然而对于长的一个,我得到了不完整的数据包。这让我很困惑。*)那么什么是最好的编码,ASCII?实际上,我只为ASCII字符工作。好的,我会重写我的代码。非常感谢。老实说,我建议您使用UTF-8——对于ASCII数据,它将完全相同,但这意味着您可以在将来处理所有的Unicode。我仍然强烈建议您去掉静态数据。尝试以更面向对象的方式思考。当我在StreamReader中包装NetworkStream时,调用ReadToEnd()将阻止应用程序。调用ReadToEnd()是错误的吗?无论如何,如何将我的代码附加到我的评论中?@xport:编辑您的问题,而不是将代码放在评论中。但是,您是对的:
ReadToEnd
确实会阻塞,直到另一端关闭连接。如果您不想这样做,请不要调用
ReadToEnd
:)当然,任何读取方法都会被阻塞。如果你不了解自己想要达到的目标,就很难提出你应该做什么。谢谢乔恩·斯基特。我现在将非常详细地编写我的场景。明天我会让你知道的。粗略地说,我的场景是开发一个ASP.NET应用程序,允许客户端输入数学表达式,处理这些表达式,最后将它们发送回客户端。例如:客户端向my page Integrator.aspx提交x^2+sin(x)。页面代码将输入转发给MAXIMA内核。Maxima是一个计算机代数系统,作为套接字机制中的客户端工作。处理后的数据将被发送回页面代码,然后提交给客户端。感谢Jon Skeet提供的有用意见。坦白地说,我是编程界的新手。*)我使用静态字段是因为这些字段位于一个静态类中,可以准确地实例化单个对象。该对象将充当侦听多个客户端的服务器代理。*)在静态c中