java ftp 客户端的使用 补充 Truncated server reply: ‘220 ‘问题

ftp 客户端

补充 Truncated server reply: '220 '问题
涉及的类库

sun.net.ftp.FtpClient

org.apache.commons.net.ftp.FTPClient

下面分别介绍两个类的使用

首先搞一个ftp服务端

如果自己ftp 服务器略过此过程

如果搭建ftp 服务器可以百度一下,有很多的教程,这里就不再描述了

最后搞到 账号 密码 IP 端口 这些就基本够用了,windows ftp服务器可视化界面非常简单

主动被动模式

开始之前一定要了解什么是ftp 的主动被动模式,要不然开发过程会遇到很多问题,不知道怎么入手

主动模式:

FTP客户端使用N(N>1023)端口连接到FTP服务器的21端口,发送用户名和密码登录,登录成功后要list列表或者读取数据时,客户端开放N+1端口,发送 PORT命令到FTP服务器,告诉服务器客户端采用主动模式并开放端口;FTP服务器收到PORT主动模式命令和端口号后,通过服务器的20端口和客户端开放的端口连接,发送数据.

被动模式:

FTP客户端使用N(N>1023)连接FTP服务器的21端口,发送用户名和密码登录,登录成功后要list列表或者读取数据时,发送PASV命令到FTP服务器, 服务器在本地开放一个端口(1024以上),然后把开放的端口告诉客户端, 客户端再通过N+1端口连接到服务器开放的端口进行数据传输

更详细的答案可以百度搜一下

主动和被动的区别就是传输端口不一致的问题,开发过程中可能会因为防火墙造成无法进行文件传输等问题

业务流程

  1. 创建连接
  2. 登录
  3. 创建文件夹
  4. 传输文件
  5. 关闭

sun.net.ftp.FtpClient 客户端开发

创建连接
 		FtpClient client = FtpClient.create();
        //client.enablePassiveMode(true);//主动模式
        SocketAddress socketAddress = new InetSocketAddress(ip, 端口);
        client.setConnectTimeout(timeOut);
        client.setReadTimeout(timeOut);
        client.connect(socketAddress);
登录
     	client.login(userName, pass.toCharArray());//登录
        FtpReplyCode ftpReplyCode = client.getLastReplyCode();
        log.info("连接信息 {}", ftpReplyCode);
        if (!ftpReplyCode.isPositiveCompletion()) {
            log.error("ftp 连接失败");
            throw new FtpLoginException("ftp连接失败");
        }

创建目录并进入
		try {
            client.changeDirectory(rootDir);
        } catch (FtpProtocolException | IllegalArgumentException exception) {
            log.error("文件夹不存在进行创建 ", rootDir);
            client.makeDirectory(rootDir);
            client.changeDirectory(rootDir);
        }
上传文件
		InputStream in = getDownIn(filPath);

        assert null == in : "下载失败";

        try {
            client.setBinaryType();
            client.putFile(fileName, in);
        } catch (Exception e) {
            log.error(e.getMessage(),e);
            throw new Exception("上传失败");
        } finally {

            if (null != in) {
                in.close();
            }
        }
关闭
client.close();

然后本地测试是没有问题的,连接远程ftp时,发现登录成功,但是上传文件的时候一直 超时

java.net.ConnectException: Connection timed out: connect

然后经过排查和验证发现是端口的问题,这里还要说一下sun.net.ftp.FtpClient 只有被动模式,没有主动模式,他设置模式的方法是

client.enablePassiveMode(true)

但是看原来发现这个方法没啥用

   public sun.net.ftp.FtpClient enablePassiveMode(boolean var1) {
        return this;
    }
   

可以看到final修饰

public class FtpClient extends sun.net.ftp.FtpClient {
    private final boolean passiveMode = true;

所以不推荐使用这个类库

org.apache.commons.net.ftp.FTPClient 客户端使用

引入依赖
   gradle implementation("commons-net","commons-net","3.7.2")
创建连接
 	 	FTPClient client = new FTPClient();
     	client.enterLocalActiveMode();//主动
      	client.enterLocalPassiveMode();//被动
        InetAddress inetAddress = InetAddress.getByName(host);
        client.connect(inetAddress,port);
登录
 
   	boolean isLogin = client.login(userName,pass);
        if(isLogin){
            log.info("ftp {} 登录成功",userName);
            return this;
        }
        log.error("ftp {} 登录失败",userName);
        throw new IOException("ftp 登录失败");
创建目录并进入
	
        String rootDir = new String(rootDir.getBytes("GBK"),"iso-8859-1");
        client.makeDirectory(rootDir);
        client.changeWorkingDirectory(rootDir);

new String(rootDir.getBytes(“GBK”),“iso-8859-1”); 这句是为了显示中文

上传文件
	boolean flag = client.storeFile( new String(fileName.getBytes("GBK"),"iso-8859-1"),inputStream);
            inputStream.close();
关闭
   client.disconnect();

经测试出色完成任务,这个类库还有很多方法,可以根据自己的需要看一看

补充 Truncated server reply: '220 '问题

完整错误
org.apache.commons.net.MalformedServerReplyException:
 Truncated server reply: '220 '

这个错误不影响连接
捕获这个错误继续操作就行,220代表已经连接成功了!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值