首页 文章

WP8.1 HttpClient Stream只获得65536字节的数据

提问于
浏览
3

我正在尝试在windows-runtime上为win8.1和wp8.1的MediaElement编写一个实时的flv流解复用器 .

我已经完成了demux代码,flv文件可以正确地解复用为h264和aac tag-datas .

当我尝试播放网络文件和流时,我遇到了一个非常奇怪的网络问题:

相同的代码,

  • 在win8.1下运行,一切都很好,无论文件或网络流如何(证明demux代码没问题);

  • 在wp8.1下运行(真正的手机或模拟器),文件很好,网络流坏 - 无论我如何从HttpClient Stream读取字节,目标服务器只给我65536字节数据,然后连接被阻塞,没有任何响应和错误,甚至没有超时,它只是扼杀线程 .

打开流的代码:

var uri = new Uri("http://hdl.xxx.com/live/yyyy")
//uri is dymatic
var client = new HttpClient();
var stream = await client.GetStreamAsync(uri);
openStream(stream)

读取数据的代码:

public static byte[] ReadBlocks(this Stream stream, int count)
{
    byte[] buffer = new byte[count];
    int offset = 0;
    int length;

    while (offset < count)
    {
        //a loop statement to guarantee I can get *count* bytes
        Debug.WriteLine("read " + (count - offset));
        //a debug message show how many bytes do I need
        length = stream.Read(buffer, offset, count - offset);
        if (length == 0)
        {
            throw new EndOfStreamException();
        }
        Debug.WriteLine("got " + length);
        //a debug message show how many bytes I got
        offset += length;
    }
    return buffer;
}

例如,当我需要从flv流中获取1024个字节时,我在wp8.1下运行stream.ReadBlocks(1024),调试告诉我:

read 1024
got 768
read 256

然后什么也没发生了 . 我写了一个额外的计数器,计数器显示一旦服务器发送总共65536个字节,接下来的读取方法将始终被阻塞 .

我相信uri是可用的 . 我可以使用pc网页浏览器下载一些流数据作为flv文件,这个下载的flv文件也可以在wp8.1下播放 .

看起来这个问题只发生在wp8.1下,android和ios不受影响 .

那么这是我的代码问题还是实际上服务器没有正确设置?

从过去三周开始,我尝试了每个可以打开流的http方法,但仍然被阻塞在65536字节 .

有人可以帮帮我吗?

1 回答

  • 2

    我刚刚解决了同样的问题 - 不要使用System.Net.HttpClient,而是使用Windows.Web.Http.HttpClient

    System.Net中的一个使用 Headers Connection:默认关闭,这会导致流关闭,只读取65 kB . 它还包含一个错误,它会阻止您将标头覆盖为Keep-Alive(它会抛出一些无意义的异常)

相关问题