Ftp连接问题


  下载功能用的是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

微信公众号:

                      


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM