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