ftpclient文件上传 connection reset问题
给项目开发了一个ftp组件(ftp client)用来处理通用的上传下载的问题。今天出现一个很奇怪的问题,部署在A地的ftp client去连接B地的ftp server进行文件上传的时候出现connection reset的异常。
最开始怀疑ftp server的问题,但用ftp客户端工具可以连上server,所以这个嫌疑排除。
重新部署ftp client到另外的一台服务器,发现问题不在重现,之后试了很多台服务器包括本地的windows开发机也没有这个问题。
所以怀疑是A服务器本身的问题,可能是安全策略限制导致的。
上网查了下资料,发现ftp数据传输有两种模式:FTP Port模式和FTP Passive模式
于是在代码里面,在获取到ftp链接之后就将模式改成Passive模式,问题解决!
ftpclient.enterLocalPassiveMode();
stackoverflow的解释:
“before you initiate transfer. I suspect you need to get into PASV mode for data transfer. This can happen in case you are behind a router (NAT) or a firewall. The FTP server will try to connect to you for data connection by default, which means you start listening on some port and invite server to connect to it for transfer of data. But in case you are behind firewall or router, the server cannot connect to you directly. PASV mode instructs FTP server to instead open a port on server for transfer and the client connects to it.”
大体的意思是,设置FTPClient.enterLocalPassiveMode();在每次数据连接之前,ftp client协商ftp server开通一个端口来传输数据。
参考资料:

浙公网安备 33010602011771号