C# StreamSocket DataReader ReadToEnd扩展方法
我想在C# StreamSocket DataReader ReadToEnd扩展方法,c#,.net,windows-8,windows-runtime,.net-4.5,C#,.net,Windows 8,Windows Runtime,.net 4.5,我想在Windows.Storage.Streams.DataReader类上实现一个名为ReadToEnd的扩展方法。这基本上应该读取流上的所有可用数据,如System.IO.StreamReader 尝试尽可能轻松地移植不兼容的WinRT代码 我不确定如何实现这一点,或者这是否可能。设法写了一些东西来满足我的需求 internal static string ReadLine(this DataReader stream, ref int maxLength, Encoding encodi
Windows.Storage.Streams.DataReader
类上实现一个名为ReadToEnd的扩展方法。这基本上应该读取流上的所有可用数据,如System.IO.StreamReader
尝试尽可能轻松地移植不兼容的WinRT代码
我不确定如何实现这一点,或者这是否可能。设法写了一些东西来满足我的需求
internal static string ReadLine(this DataReader stream, ref int maxLength, Encoding encoding, char? termChar)
{
var maxLengthSpecified = maxLength > 0;
int i;
byte b = 0, b0;
var read = false;
using (var mem = new MemoryStream())
{
while (true)
{
b0 = b;
i = stream.ReadByte();
if (i == -1) break;
else read = true;
b = (byte)i;
if (maxLengthSpecified) maxLength--;
if (maxLengthSpecified && mem.Length == 1 && b == termChar && b0 == termChar)
{
maxLength++;
continue;
}
if (b == 10 || b == 13)
{
if (mem.Length == 0 && b == 10)
{
continue;
}
else break;
}
mem.WriteByte(b);
if (maxLengthSpecified && maxLength == 0)
break;
}
if (mem.Length == 0 && !read) return null;
return encoding.GetString(mem.ToArray(), 0, (int)mem.Length);
}
}
System.IO.Stream
没有ReadToEnd()
方法。你说的是System.IO.TextReader.ReadToEnd()
?还有,为什么您的问题标题中有StreamSocket
?这和你的问题有什么关系?嗨,达林。你说得对。我据此结束了问题。关于StreamSocket,我引用了它,因为您通常将DataReader与之结合使用。希望那些经常使用StreamSocket的开发人员会有一个解决方案,因为他们可能也做过类似的事情。当您处理网络流时,使用ReadToEnd
操作没有任何意义。如果没有更多可用数据,则从套接字读取的数据将被阻止,并且代码将挂起。通常,在处理套接字时,您使用的是TCP上的某些协议,例如HTTP。每个协议都应该有一种方法来指定有多少数据可供读取,否则客户机将不知道要读取多少数据,如果他试图读取更多数据,就会挂起。例如,在HTTP协议中,服务器通过Content Length
响应头指示这一点。@DarinDimitrov在HTTP/1.0中,不提供Content Length
是很常见的,客户端依赖服务器关闭连接来指示所有数据都已传输。