下载功能用的是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
微信公众号: