从互联网上我找到了从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的示例。
我们的阅读是否有“对称”的写作模式?
提前谢谢。
答案 0 :(得分:5)
阅读代码在很多方面都是危险的错误:
DataAvailable
属性来决定何时应该“完成” - 这非常危险,因为这意味着如果数据包在流中被延迟,您可以读取的数据量是预期的一半Encoding.Unicode
,这很少是编码的最佳选择Encoder
/ Decoder
类的用途......但是你无论如何都不需要在这里使用它们 - 见下文。我强烈建议您将NetworkStream
包裹在StreamReader
中以供阅读,并StreamWriter
进行书写。这就是他们的目的。然后,您可以一次读取一行,或只读取char[]
缓冲区,或者读取流的末尾(这意味着“直到套接字关闭”)。这适用于纯文本协议。
如果你有一个混合文本和二进制数据的协议,生活变得更加困难。就个人而言,我喜欢使用长度前缀消息的协议 - 这样你就可以只读取 你想要的数据,然后执行你想要的任何转换。
无论如何,我希望随机选择这些想法有助于......如果您需要更详细的帮助,请提供您正在使用的协议的详细信息。