2014-09-19 44 views
0

我試圖從FTP服務器下載一些文件與FTPClient(commons-net-3.3)。從服務器下載文件凍結應用程序,並失去連接

當點擊一個AsyncTask按鈕時,我得到一個FTPFile s的列表listFiles(path);。然後我下載喜歡這個列表中的每個文件(所有工作在相同的AsyncTask)

FileOutputStream desFileStream = new FileOutputStream("localfile"); 
InputStream input = mFTPClient.retrieveFileStream("remotepath"); 
byte data[] = new byte[512]; 
long total = 0; 
int count; 
while ((count = input.read(data)) != -1) { 
    total += count;        
    Double porcentaje = ((double) total/(double) tmpFiled.getSize()) * 100; 
    publishProgress((int) Math.round(porcentaje)); 
    desFileStream.write(data, 0, count); 
    } 

    desFileStream.flush(); 
    desFileStream.close(); 
    input.close(); 
}} 

尤其是在input.read(data)。這必須讀取1024個字節,但在隨機迭代比1024讀取更少的數據,寫它,並在下一次迭代input.read(data)凍結下載回報已逾時例外

後,該處分的互聯網連接不工作

logcat中顯示了這種例外

09-19 09:59:06.890: W/System.err(13215): java.net.SocketException: recvfrom failed: ETIMEDOUT (Connection timed out) 
09-19 09:59:06.900: W/System.err(13215): at libcore.io.IoBridge.maybeThrowAfterRecvfrom(IoBridge.java:545) 
09-19 09:59:06.900: W/System.err(13215): at libcore.io.IoBridge.recvfrom(IoBridge.java:509) 
09-19 09:59:06.900: W/System.err(13215): at java.net.PlainSocketImpl.read(PlainSocketImpl.java:488) 
09-19 09:59:06.920: W/System.err(13215): at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46) 
09-19 09:59:06.920: W/System.err(13215): at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:240) 
09-19 09:59:06.920: W/System.err(13215): at java.io.FilterInputStream.read(FilterInputStream.java:118) 
09-19 09:59:06.920: W/System.err(13215): at java.io.InputStream.read(InputStream.java:162) 
09-19 09:59:06.920: W/System.err(13215): at com.asde.telemedicina.FTPHandler.ftpDownload(FTPHandler.java:405) 
09-19 09:59:06.920: W/System.err(13215): at com.asde.telemedicina.FTPHandler.doInBackground(FTPHandler.java:167) 
09-19 09:59:06.920: W/System.err(13215): at com.asde.telemedicina.FTPHandler.doInBackground(FTPHandler.java:1) 
09-19 09:59:06.920: W/System.err(13215): at android.os.AsyncTask$2.call(AsyncTask.java:288) 
09-19 09:59:06.920: W/System.err(13215): at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
09-19 09:59:06.920: W/System.err(13215): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
09-19 09:59:06.930: W/System.err(13215): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
09-19 09:59:06.930: W/System.err(13215): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
09-19 09:59:06.930: W/System.err(13215): at java.lang.Thread.run(Thread.java:841) 
09-19 09:59:06.930: W/System.err(13215): Caused by: libcore.io.ErrnoException: recvfrom failed: ETIMEDOUT (Connection timed out) 
09-19 09:59:06.930: W/System.err(13215): at libcore.io.Posix.recvfromBytes(Native Method) 
09-19 09:59:06.930: W/System.err(13215): at libcore.io.Posix.recvfrom(Posix.java:141) 
09-19 09:59:06.930: W/System.err(13215): at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:164) 
09-19 09:59:06.930: W/System.err(13215): at libcore.io.IoBridge.recvfrom(IoBridge.java:506) 
09-19 09:59:06.930: W/System.err(13215): ... 14 more 

例如在摩托羅拉Moto G中從來沒有發生過,但是在其他發生的事件中卻從未發生過。我',e嘗試了兩個ftpservers。

可能導致問題本地文件權限?

任何人都可以幫我嗎?

+0

應用程序崩潰了嗎?你可以在緩慢連接和大文件的情況下製作進度條 – Gattsu 2014-09-19 08:26:57

+0

我編輯了第一條消息。這個問題似乎是一個超時,但只發生在一些dispositives。 – Hanzo 2014-09-19 09:01:20

+0

我增加了更多信息,問題似乎在'input.read(data)'中。 – Hanzo 2014-09-19 11:37:51

回答

1

我認爲你的錯誤可能是由多個活躍的下載連接引起的,它會使你的網絡連接飽和。並生成超時異常。它應該解釋你的錯誤的隨機特徵。爲了避免它,我認爲你必須限制同時下載的數量。

在谷歌上做了一些搜索後,我也進行了(即使我認爲這不是你的情況),在冰淇淋三明治和早期的「連接超時」錯誤可能與DNS雙緩存有關。看到這個Issue

+0

嗨,我不認爲這個問題與冰的bug有關奶油,因爲在Android 4.4.4(KitKat)的手機也發生。關於同時下載,我不開始新的donwload,直到最後一個已經完成。當'input.read(data))!= -1'時,我關閉輸入和輸出並打開一個新的。 – Hanzo 2014-09-29 06:47:07

+0

而連接總是穩定的? – 2014-09-29 07:02:45

+0

它不能由連接斷開導致? – 2014-09-29 07:09:28

1

我已經做了很少的搜索和嘗試;

FileOutputStream desFileStream = new FileOutputStream("localfile"); 
mFTPClient.setFileType(FTP.BINARY_FILE_TYPE); // File type can be changed 
boolean status = mFTPClient.retrieveFile("remotepath",desFileStream); 
+0

我不知道如何解決這個代碼我的問題。如果你閱讀我的代碼,你會發現我得到的文件就像一個流。 – Hanzo 2014-09-25 13:13:54

+0

你得到流,但直接將其轉換爲文件並保存在手機上。此代碼正在獲取文件並將其保存到存儲中,而無需任何InputStream操作。 – 2014-09-25 13:18:29

0

特別地,在input.read(數據)。這必須讀取1024個字節,但在隨機迭代中讀取的數據少於1024個

不,它不是「必須的」。下面是Java文檔賽斯:

int read(byte[] b)
讀取從輸入流中,並將它們存儲到緩衝區數組b一定數量的字節。

該函數讀取數據直至緩衝區大小,而不是該大小。

InputStream input = mFTPClient.retrieveFileStream(「remotepath」);

什麼是「remotepath」?
它是一個文件,或者它是一個目錄?

萬一這是一個文件,問題是在該行input.close();,因爲你已經在第一次循環讀取幾個字節後您關閉流,然後試圖從第二次迭代的封閉流中讀取(如已在評論中說過)。

萬一它是一個目錄,那麼你就是不能像你想要的那樣下載它。 FTP協議中有一個LIST命令,它列出當前目錄中的文件。您必須列出這些文件並分別下載每個文件。

+0

嗨,remotepath是一個文件,我只在輸入時關閉input.read(data))!= -1',即當文件已經下載時 – Hanzo 2014-09-29 06:52:49

相關問題