【问题标题】:StreamSocket DataReader ReadToEnd extension methodStreamSocket DataReader ReadToEnd 扩展方法
【发布时间】:2013-01-04 13:05:12
【问题描述】:

我想在 Windows.Storage.Streams.DataReader 类上实现一个名为 ReadToEnd 的扩展方法。这应该基本上读取流上的所有可用数据,如 System.IO.StreamReader。

尽量让我的不兼容 WinRT 代码的移植变得尽可能简单。

我不确定如何实现这一点,或者是否可能。

【问题讨论】:

  • System.IO.Stream 没有 ReadToEnd() 方法。你是在说System.IO.TextReader.ReadToEnd()吗?另外为什么你的问题标题中有StreamSocket?这与您的问题有什么关系?
  • 嗨达林。你是对的。相应地修改了问题。关于 StreamSocket,我引用了它,因为您通常将 DataReader 与它结合使用。希望经常使用 StreamSocket 的开发人员能够找到解决方案,因为他们可能做过类似的事情。
  • 当您处理具有ReadToEnd 操作的网络流时没有任何意义。如果没有更多可用数据并且您的代码将挂起,则从套接字读取将被阻塞。通常,当您处理套接字时,您正在使用一些基于 TCP 的协议,例如 HTTP。每个协议都应该有一种方法来指定有多少数据可供读取,否则客户端将不知道要读取多少,并且如果他尝试读取更多数据就会挂起。例如,在 HTTP 协议中,服务器通过 Content-Length 响应标头指示这一点。
  • @DarinDimitrov 在 HTTP/1.0 中,不提供 Content-Length 是很常见的,客户端依赖服务器关闭连接来指示所有数据已传输。

标签: c# .net windows-8 windows-runtime .net-4.5


【解决方案1】:

设法写了一些能满足我要求的东西。

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);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 2010-09-09
    • 2020-02-29
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    相关资源
    最近更新 更多