插座关闭前长时间延迟

时间:2012-03-23 09:41:10

标签: java sockets

情景:

我正在构建一个使用Commons Net FTPSClient连接服务器的应用程序。

如果连接中断,我想重新启动它。我尝试使用ftp.disconnect();

来实现这一目标

disconnect()来电socket.close()

只需拉动电线即可模拟连接中断。

问题:

socket.close()大约需要9分钟(540秒)才能完成。

这是为什么?我该如何改变呢?

socket.getSoLinger()返回-1(已停用),socket.getSoTimeout()返回30000(30秒)

2 个答案:

答案 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);
            }