2011-05-11 33 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

相關問題