2011-05-11 139 views
0

我正在从服务器流式传输文件,然后将其流式传输回套接字(基本上是流代理)。这被用来缓冲歌曲。所以一旦缓冲区已满,在缓冲区清空之前不会再有数据从套接字读取。但是,再次读取数据时,InputStream将读取X个字节,然后突然返回-1表示文件结束,否则表示文件结束。是否有超时发生?InputStream在文件结束前返回-1

下面是一些示例代码:

InputStream data = realResponse.getEntity().getContent(); 

    ...some code... 

    int totalBytes = 0; 
    int count = 0; 
    // Start streaming content. 
    byte[] buff = new byte[1024 * 50]; 
    while (isRunning && (readBytes = data.read(buff, 0, buff.length)) != -1) { 
    totalBytes += readBytes; 

    Log(count + ": buffer:" + buff + " readBytes:" + readBytes + " total:" + totalBytes); 
    client.getOutputStream().write(buff, 0, readBytes); 
    Log("Finished write"); 
    count++;   

    } 

日志的一个例子是这样的:

0: buffer:[email protected] readBytes: 16164 total: 16164 
1: buffer:[email protected] readBytes: 16384 total: 32548 
... 
100: buffer:[email protected] readBytes: 16384 total: 1654564 
<a long pause here> 
100: buffer:[email protected] readBytes: 16384 total: 1670948 
100: buffer:[email protected] readBytes: 16384 total: 1687332 
-1 Received 

任何帮助或建议,欣赏

+3

上面的日志似乎不符合代码。日志中没有“完成写入”消息,并且没有记录“-1已接收”的代码。在'totalBytes'范围内定义了'readBytes'? 'count'在哪里设置? 'count'和'readBytes'之间有关系吗? – 2011-05-11 02:48:33

+0

为了可读性,我清理了一些日志并取出了“完成的写入”,但忘记将它从代码中取出。 “-1已收到”在未显示的日志语句中。 readBytes,totalBytes和count都在范围内。 count变量只是用于调试已经完成了多少次读/写操作。 – Nick 2011-05-11 14:17:29

+0

那'isRunning'布尔检查怎么样?这是一个多线程应用程序吗?可以设置该标志为false? – amischiefr 2011-05-11 14:31:10

回答

0

read()返回-1,在结束的流而不是之前。如果您比预期的时间提前-1,则数据比预期的要短,或者服务器提前结束预期。

+0

我假设服务器在数据未被读取数据之后可能会关闭连接数分钟。正确的方法是重新打开连接并继续阅读?将Range头设置为可接受的解决方案?或者是否可以保持连接更长时间?谢谢。 – Nick 2011-05-12 01:33:28

+0

@Nick:如果您使用的是HTTP范围标头,可能会起作用,具体取决于您的服务器。真正的问题是为什么暂停?你在写什么?它是否缓冲?它是一个插座吗?如果是这样,它是否有一个大的套接字发送缓冲区?另一端是什么?为什么它会拖延?你真的会一次获得16384字节吗? – EJP 2011-05-12 04:59:31

+0

我一直在尝试使用Range头,但是,我仍然在努力,并且遇到了一些问题。发生暂停是因为接收端缓冲区已满,因此无法接受更多数据。我正在写一个套接字,但在这种情况下,套接字发送缓冲区的大小是多少,因为接收端的缓冲区正在填充?接收数据的另一端是移动设备上的MediaPlayer类,该类尝试使用少量内存,因此使用小缓冲区并停止。是的,我实际上获得16483字节。 – Nick 2011-05-12 14:07:34