FTP 和 SFTP上传,以及FTP上传时卡死、连接迟迟关闭不了,耗费资源,以及 SFTP上传时问题
2017-07-06 11:14
3843 查看
首先FTP和SFTP 的详细工具类在这就不贴了 我已经上传上去了。
我在开发中碰到的问题;
传输模式
ASCII传输方式:
支持简单文本文件传输,如果是程序,数据库,字处理文件或者压缩文件(尽管字处理文件包含的大部分是文本,其中也包含有指示页尺寸,字库等信息的非打印字符)中途会转译,导致文件上传上去损坏、无法运行;
二进制传输模式:
在二进制传输中,保存文件的位序,以便原始和拷贝的是逐位一一对应的;
工作方式
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();
稍微点点源码就知道 ,这个方法和上面的方法 都是同步的等待一个回应,这块等待的是 退出登录 注销的回应; 所以有时会卡顿 有时没问题,
所以关闭的时候,你可以酌情使用, 直接
SFTP 2个问题;
使用的是JSCH框架;
Session is down
FTP登录用户是否有操作上传目录的权限;
Session 超时时间;
程序上传成功后, 发现目标目录没有存在目标文件
确保你已经进入目标目录之后再上传,
我在开发中碰到的问题;
传输模式
ASCII传输方式:
支持简单文本文件传输,如果是程序,数据库,字处理文件或者压缩文件(尽管字处理文件包含的大部分是文本,其中也包含有指示页尺寸,字库等信息的非打印字符)中途会转译,导致文件上传上去损坏、无法运行;
二进制传输模式:
在二进制传输中,保存文件的位序,以便原始和拷贝的是逐位一一对应的;
工作方式
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);
相关文章推荐
- weblogic中破解以及ftp上传问题解决
- 数据库连接不关闭造成的问题以及RowSet的使用
- CentOS6.4 Ftp服务器远程主机关闭连接问题
- 电脑连接移动热点phpstorm ftp 上传失败问题
- socket使用TCP协议时,send、recv函数解析以及TCP连接关闭的问题
- Linux后台启动程序以及打开XShell连接运行java -jar然后关闭连接程序不再运行问题
- ftp、sftp利用bat脚本自动下载以及上传文件
- socket使用TCP协议时,send、recv函数解析以及TCP连接关闭的问题
- FTP上传文件时 System.Net.WebException: 基础连接已经关闭: 接收时发生错误。
- 关注程序性能(1)jconsole 连接远程linux上的tomcat,以及解决配置后tomcat关闭不了的问题
- socket使用TCP协议时,send、recv函数解析以及TCP连接关闭的问题
- socket使用TCP协议时,send、recv函数解析以及TCP连接关闭的问题
- 关于intellij14的web项目导入lib丢失以及上传资源图片等无法访问的问题
- ASP.NET AJAX 1.0资源连接以及对一些常见问题的答复
- asp.net使用FtpWebRequest向ftp上传文件报错 基础连接已经关闭: 服务器提交了协议冲突
- ftp上传问题解决过程以及思考-pasv以及port两种模式
- SFTP工具类——切换目录,遍历保存一个目录,关闭资源,获取连接
- Java使用SFTP和FTP两种连接方式实现对服务器的上传下载
- socket使用TCP协议时,send、recv函数解析以及TCP连接关闭的问题
- ssm框架中,上传的资料存放在另外一台ftp服务器中是如何实现的?以及编码问题