java - 套接字关闭前的长时间延迟

标签 java sockets

场景:

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

如果连接断开,我想重新启动它。我尝试使用 ftp.disconnect(); 来完成此任务

disconnect()来电 socket.close()

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

问题:

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

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

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

最佳答案

我认为这是控制 channel 保持 Activity 功能的问题:

文件传输期间,数据连接繁忙,但控制连接空闲。 FTP 服务器知道控制连接正在使用中,因此不会因缺乏 Activity 而关闭它,但网络路由器很难知道控制连接和数据连接彼此关联。

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

关于java - 套接字关闭前的长时间延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9836905/

相关文章:

java - LIBMSVM svm_node 格式

C++ 如何将整数和 float 等数据类型编码为字节串?

java - 如何使用 Java 类在 Cassandra 中创建 KEYSPACE

c - C 中的 SSL 密码帮助

node.js - Websockets - 自定义排队系统有意义吗?

c++ - 每个 session 的连接或通过一个连接多路复用多个 session

java - 从 Esper + sockets 开始

java - 在 Java 8 中用另一个列表过滤对象列表的列表

java - 图像和图形Java

java - 如何让JTable显示数据库中的所有记录