(1) PORT(主動模式)html
PORT中文稱爲主動模式,工做的原理: FTP客戶端鏈接到FTP服務器的21端口,發送用戶名和密碼登陸,登陸成功後要list列表或者讀取數據時,客戶端隨機開放一個端口(1024以上),發送 PORT命令到FTP服務器,告訴服務器客戶端採用主動模式並開放端口;FTP服務器收到PORT主動模式命令和端口號後,經過服務器的20端口和客戶端開放的端口鏈接,發送數據,原理以下圖。java
(2) PASV(被動模式)服務器
PASV是Passive的縮寫,中文成爲被動模式,工做原理:FTP客戶端鏈接到FTP服務器的21端口,發送用戶名和密碼登陸,登陸成功後要list列表或者讀取數據時,發送PASV命令到FTP服務器, 服務器在本地隨機開放一個端口(1024以上),而後把開放的端口告訴客戶端, 客戶端再鏈接到服務器開放的端口進行數據傳輸,原理以下圖:url
2.兩種模式的比較htm
從上面的運行原來看到,主動模式和被動模式的不一樣簡單概述爲: 主動模式傳送數據時是「服務器」鏈接到「客戶端」的端口;被動模式傳送數據是「客戶端」鏈接到「服務器」的端口。blog
主動模式須要客戶端必須開放端口給服務器,不少客戶端都是在防火牆內,開放端口給FTP服務器訪問比較困難。登錄
被動模式只須要服務器端開放端口給客戶端鏈接就好了。原理
參考文獻 http://www.cnblogs.com/mawanglin2008/articles/3607767.html服務器端
3.java中,內網用被動模式 ,外網鏈接時用主動模式,服務器相應改動(只用上線功能用被動模式去鏈接ftp報錯鏈接不上)ftp
FTPClient ftpClient = new FTPClient();
ftpClient.connect(url, port);
ftpClient.enterLocalActiveMode(); //主動模式 // ftpClient.enterLocalPassiveMode(); 被動模式 ftpClient.setControlEncoding("UTF-8"); ftpClient.changeWorkingDirectory(path);