在k8s的pod上使用apache的commons-net:ftp功能時,一直顯示:apache
即上傳文件失敗,可是在本地環境進行上傳時卻又顯示上傳成功,讓人十分不解。在網上搜索了一下ftp的一些資料發現ftp共有兩種模式(參考https://blog.csdn.net/nyunyuzhao/article/details/5734978),分爲被動(pasv)和主動模式(port),commons-net:ftp默認使用的是主動模式,即客戶端發起鏈接,告訴服務器我開了某個端口你過來鏈接我,在本地環境下由於有公網IP的存在,服務器端可以經過ip+port訪問到客戶端機器,可是k8s的pod暴露出去的非實際ip,因此服務器端不能鏈接到客戶端,形成了文件沒法傳輸成功。在被動模式中,都是客戶端去鏈接服務器端,因此可以訪問。服務器
commons-net:ftp設置使用被動模式的代碼爲:.net
FTPClient ftpClient = new FTPClient(); ftpClient.setDefaultPort(ftpServerPort); ftpClient.connect(ftpServer); ftpClient.login(username, password); ftpClient.setFileType(FTP.BINARY_FILE_TYPE); ftpClient.setBufferSize(10 * 1024); ftpClient.setSendBufferSize(10 * 1024); ftpClient.enterLocalPassiveMode();//重點在這一句,就是這裏設置主被動模式
參考博文:https://blog.csdn.net/nyunyuzhao/article/details/5734978blog