Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.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# StreamSocket DataReader ReadToEnd扩展方法_C#_.net_Windows 8_Windows Runtime_.net 4.5 - Fatal编程技术网

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
是很常见的,客户端依赖服务器关闭连接来指示所有数据都已传输。