下載功能用的是sun.net.ftp.FtpClient,遇到了一個問題,連接總是報:TYPE I:530 Please login with USER and PASS.
代碼是:
public void connect(String ip, int port, String user, String password, String path) { try { ftpClient =FtpClient.create(); ftpClient.connect(new InetSocketAddress(ip, port)); // ftpClient = FtpClient.create(new InetSocketAddress(ip, port)); ftpClient.login(user, null, password); ftpClient.setBinaryType(); System.out.println("login success!"); if (path.length() != 0) { ftpClient.changeDirectory(path); } ftpClient.setBinaryType(); } catch (IOException ex) { ex.printStackTrace(); throw new RuntimeException(ex); } catch (FtpProtocolException e) { e.printStackTrace(); } }
先百度了下,發現這個版本都是這種寫法,無奈只好看login的代碼:
public void connectServer(String ip, int port, String user, String password, String path) { try { ftpClient =FtpClient.create(); ftpClient.connect(new InetSocketAddress(ip, port)); // ftpClient = FtpClient.create(new InetSocketAddress(ip, port)); ftpClient.login(user, null, password); // 設置成2進制傳輸 ftpClient.setBinaryType(); System.out.println("login success!"); if (path.length() != 0) { // 把遠程系統上的目錄切換到參數path所指定的目錄 ftpClient.changeDirectory(path); } ftpClient.setBinaryType(); } catch (IOException ex) { ex.printStackTrace(); throw new RuntimeException(ex); } catch (FtpProtocolException e) { e.printStackTrace(); } }
看到this.tryLogin(var1, var2)就發現了。。。,為了確認看一下它的代碼:
private void tryLogin(String var1, char[] var2) throws FtpProtocolException, IOException { this.issueCommandCheck("USER " + var1); if(this.lastReplyCode == FtpReplyCode.NEED_PASSWORD && var2 != null && var2.length > 0) { this.issueCommandCheck("PASS " + String.valueOf(var2)); } }
原來第二個char數組才是密碼。。。,於是改成:
ftpClient.login(user, password.toCharArray());
我就不該百度,就是偷了一下懶。。。
另外,有一點要注意如果用的是ftpClient.setBinaryType()返回的類型是SocketInputStream類型,而ftpClient.setAsciiType()返回的是TelnetInputStream,不對應是會報錯的,或者干脆就InputStream也是可以的。。。
==========================================================
咱最近用的github:https://github.com/saaavsaaa
微信公眾號: