我正在构建一个使用Commons Net FTPSClient连接服务器的应用程序。
如果连接中断,我想重新启动它。我尝试使用ftp.disconnect();
disconnect()
来电socket.close()
只需拉动电线即可模拟连接中断。
socket.close()
大约需要9分钟(540秒)才能完成。
这是为什么?我该如何改变呢?
socket.getSoLinger()
返回-1(已停用),socket.getSoTimeout()
返回30000(30秒)
答案 0 :(得分:1)
为了帮助查明问题,您可以在调用socket.close()之后运行netstat来确定客户端所处的状态(FIN_WAIT,TIME_WAIT等)。这应该可以让您了解延迟的位置at。
答案 1 :(得分:0)
我认为这是控制频道保持活动功能的问题:
在文件传输期间,数据连接正忙,但控制连接处于空闲状态。 FTP服务器知道控制连接正在使用中,因此不会因缺乏活动而关闭它,但网络路由器要知道控制和数据连接是否相互关联起来要困难得多。
ftpClient.setControlKeepAliveTimeout(300); // set timeout to 5 minutes
并使用
进行检查 int iReply = ftpClient.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply))
{
ftpClient.disconnect();
System.err.println("FTP server refused connection.");
System.exit(1);
}