解決FTPClient linux環境下FTPClient調用retrieveFileStream導致線程掛起(防火牆問題);下載文件小於實際文件問題


FTPClient調用retrieveFileStream導致線程掛起(防火牆問題);下載文件小於實際文件問題解決
實際是因為FTP的兩種傳輸模式:主動模式被動模式的不同而導致的

FTPClient.listFiles()或者FTPClient.retrieveFile()方法時,就停止在那里,什么反應都沒有,出現假死狀 態。google一把,發現很多人也出現了此類問題,最終在一個帖子里找到了解決辦法。在調用這兩個方法之前,調用 FTPClient.enterLocalPassiveMode();這個方法的意思就是每次數據連接之前,ftp client告訴ftp server開通一個端口來傳輸數據。為什么要這樣做呢,因為ftp server可能每次開啟不同的端口來傳輸數據,但是在linux上,由於安全限制,可能某些端口沒有開啟,所以就出現阻塞。

最近因為項目需要,研究有關ftp的相關東西。結果發現一個問題。同樣的程序在不同的機器上運行,結果有一個直接導致線程掛起,另外一個運行卻正常。經過 反復的測試最后發現,線程掛起的那台機器裝有防火牆,導致調用retrieveFileStream方法時直接線程掛起。

經過網上一大堆的查找終於找到解決方法:

ftpClient.enterLocalPassiveMode(); //開啟本地被動模式
設置FTPClient為被動傳輸模式即可解決線程掛起問題。此代碼設置在登陸之后或者之前都可以。

同樣,這只適用於下載的被動傳輸模式,如果上傳的話需要enterRemotePassiveMode()//開啟遠程被動傳輸模式


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM