Java 插座关闭前的长延时 脚本:

Java 插座关闭前的长延时 脚本:,java,sockets,Java,Sockets,我正在构建一个应用程序,它使用Commons Net FTPSClient连接到服务器 如果连接断开,我想重新启动它。我试图通过使用ftp.disconnect()来实现这一点 disconnect()调用socket.close() 只需拉动电源线即可模拟连接中断 问题: socket.close()关闭大约需要9分钟(540秒) 这是为什么?我怎样才能改变它? socket.getSoLinger()返回-1(禁用)和socket.getSoTimeout()返回30000(30秒)我认为这

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

如果连接断开,我想重新启动它。我试图通过使用
ftp.disconnect()来实现这一点

disconnect()
调用
socket.close()

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

问题:
socket.close()
关闭大约需要9分钟(540秒)

这是为什么?我怎样才能改变它?


socket.getSoLinger()
返回-1(禁用)和
socket.getSoTimeout()
返回30000(30秒)

我认为这是控制通道保持活动功能的问题:

在文件传输期间,数据连接繁忙,但控制连接空闲。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);
            }

为了帮助查明问题,您可以在调用socket.close()后运行netstat来确定客户端处于什么状态(FIN\u WAIT、TIME\u WAIT等)。这应该会让你知道延迟在哪里。

遗憾的是,这似乎没有任何区别