FTPClient調用retrieveFileStream致使線程掛起(防火牆問題);下載文件小於實際文件問題解決linux
實際是由於FTP的兩種傳輸模式:主動模式和被動模式的不一樣而致使的安全
FTPClient.listFiles()或者FTPClient.retrieveFile()方法時,就中止在那裏,什麼反應都沒有,出現假死狀態。google一把,發現不少人也出現了此類問題,最終在一個帖子裏找到了解決辦法。在調用這兩個方法以前,調用FTPClient.enterLocalPassiveMode();這個方法的意思就是每次數據鏈接以前,ftp client告訴ftp server開通一個端口來傳輸數據。爲何要這樣作呢,由於ftp server可能每次開啓不一樣的端口來傳輸數據,可是在linux上,因爲安全限制,可能某些端口沒有開啓,因此就出現阻塞。測試
最近由於項目須要,研究有關ftp的相關東西。結果發現一個問題。一樣的程序在不一樣的機器上運行,結果有一個直接致使線程掛起,另一個運行卻正常。通過反覆的測試最後發現,線程掛起的那臺機器裝有防火牆,致使調用retrieveFileStream方法時直接線程掛起。google
通過網上一大堆的查找終於找到解決方法:spa
ftpClient.enterLocalPassiveMode(); //開啓本地被動模式
設置FTPClient爲被動傳輸模式便可解決線程掛起問題。此代碼設置在登錄以後或者以前均可以。線程
一樣,這隻適用於下載的被動傳輸模式,若是上傳的話須要enterRemotePassiveMode()//開啓遠程被動傳輸模式orm