FTP 和 SFTP上传,以及FTP上传时卡死、连接迟迟关闭不了,耗费资源,以及 SFTP上传时问题

  • 首先FTP和SFTP 的详细工具类在这就不贴了 我已经上传上去了。

我在开发中碰到的问题;

  1. 传输模式
    • ASCII传输方式:
      支持简单文本文件传输,如果是程序,数据库,字处理文件或者压缩文件(尽管字处理文件包含的大部分是文本,其中也包含有指示页尺寸,字库等信息的非打印字符)中途会转译,导致文件上传上去损坏、无法运行;
    • 二进制传输模式:
      在二进制传输中,保存文件的位序,以便原始和拷贝的是逐位一一对应的;
  2. 工作方式

    • Standard (也就是 PORT方式,主动方式)
      Port模式FTP 客户端首先和FTP服务器的TCP 21端口建立连接,通过这个通道发送命令,客户端需要接收数据的时候在这个通道上发送PORT命令。 PORT命令包含了客户端用什么端口接收数据。在传送数据的时候,服务器端通过自己的TCP 20端口连接至客户端的指定端口发送数据。 FTP server必须和客户端建立一个新的连接用来传送数据。

    • Passive (也就是PASV,被动方式)
      Passive模式在建立控制通道的时候和Standard模式类似,但建立连接后发送的不是Port命令,而是Pasv命令。FTP服务器收到Pasv命令后,随机打开一个临时端口(也叫自由端口,端口号大于1023小于65535)并且通知客户端在这个端口上传送数据的请求,客户端连接FTP服务器此端口,然后FTP服务器将通过这个端口进行数据的传送,这个时候FTP server不再需要建立一个新的和客户端之间的连接。

      很多防火墙在设置的时候都是不允许接受外部发起的连接的,所以许多位于防火墙后或内网的FTP服务器不支持PASV模式,因为客户端无法穿过防火墙打开FTP服务器的高端端口;而许多内网的客户端不能用PORT模式登陆FTP服务器,因为从服务器的TCP 20无法和内部网络的客户端建立一个新的连接,造成无法工作。

FTP 卡死错误 2个问题;

  • ftpClient.completePendingCommand()

    方法的作用 : 同步等待服务器返回响应, 确定代码是一个积极的完成响应的答复。以2开头的所有代码都完成积极响应。(通俗讲就是同步的等待服务器返回一个标识,是否上传成功)·
    如果你上传文件的频率很低 如每天一次等那可以忽略这个问题,通过测试发现程序会在卡很久, 我们只是为了拿到一个标识而已为何不换一种方式呢; 比如:

    • 拿本地的文件大小 与 服务器目标文件大小比较 一致则 上传成功;
      如果不一致 但 服务器目标文件大于0 ,说明传输中断 网络异常等;
  • ftpClient.logout();
    稍微点点源码就知道 ,这个方法和上面的方法 都是同步的等待一个回应,这块等待的是 退出登录 注销的回应; 所以有时会卡顿 有时没问题,
    所以关闭的时候,你可以酌情使用, 直接 ftpClient.disconnect(); 也没问题;

SFTP 2个问题;

使用的是JSCH框架;

  • Session is down
    FTP登录用户是否有操作上传目录的权限;
    Session 超时时间;
  • 程序上传成功后, 发现目标目录没有存在目标文件
    确保你已经进入目标目录之后再上传,
createpath :目标目录
 如果文件不存在 直接走到catch 新建并进入目录,
 如果存在 进入目录, 
 如果不存在新建并进入目录;
try{   
                Vector ls = sftp.ls(createpath);   
                    if( ls == null || ls.isEmpty()) {
                       //这里注意 mkdir 只能创建最后一层目录,如果是多级,创建失败.(多层的话 建议:  这块可切割 然后循环来 新建并进入;)   
                       sftp.mkdir(createpath);
                    }   
            } catch (SftpException e) {   
                  sftp.mkdir(createpath);
                  sftp.cd(createpath);
            }  
        sftp.cd(createpath);

你可能感兴趣的:(积累)