【问题标题】:Opening multiple FTP connections打开多个 FTP 连接
【发布时间】:2019-11-09 10:16:41
【问题描述】:

我在不同线程的代码中打开了多个 FTP 连接。 使用相同的凭据可以有两个到同一个 FTP 服务器的连接。

这会导致主动/被动反向通道传输数据出现问题吗?我遇到的实际问题是某个登录失败,即使它在不同的线程中工作了几秒钟。很难复制。

另一个问题,标准设置是主动还是被动?哪个更好?

FTPClient ftp = new FTPClient();

ftp.setDefaultTimeout(timeoutMilliseconds);
ftp.setDataTimeout(timeoutMilliseconds);
ftp.setConnectTimeout(timeoutMilliseconds);
//ftp.setSoTimeout(1000);
//ftp.setControlKeepAliveTimeout(1000);
//ftp.setControlKeepAliveReplyTimeout(1000);

ftp.connect(serverAddress, serverPort);
logger.info("Connected successfully to " + serverAddress + ":" + serverPort);
boolean login = ftp.login(username, password);
logger.info("Logged in successfully to " + serverAddress + ":" + serverPort);


ftp.disconnect();

【问题讨论】:

  • 您是否考虑过服务器可能会限制从一个客户端地址或网络接受的连接数? FTP 服务器通常配置为执行此操作以限制占用、缓解拒绝服务等。
  • 应用程序有两个实例,每个实例最多只能有两个到同一个 FTP 服务器的连接。我不确定FTP服务器是否有这么低的限制。另外,这个错误只发生在试生产实例中,我很难说服我的老板这不是新代码中的错误。
  • 这是两个不同的连接。它们不可能在客户端相互影响。但是如果服务器不允许,他们当然可以在服务器上。如果您提供了实际的错误消息,将会有很大帮助。主动与被动模式无关。

标签: java ftp-client


【解决方案1】:

建议使用被动模式。请找到我在项目中使用的以下设置。您可以参考https://www.jscape.com/blog/bid/80512/active-v-s-passive-ftp-simplified 了解更多详情。

FTPClient ftp = new FTPClient();
        ftp.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out)));
        ftp.connect(host, port);
        int reply = ftp.getReplyCode();
        if (!FTPReply.isPositiveCompletion(reply)) {
            ftp.disconnect();
            throw new IllegalArgumentException("Not able to connect to the ftp Server ");
        }
        ftp.login(userName, password);
        ftp.setFileType(FTP.BINARY_FILE_TYPE);
        ftp.enterLocalPassiveMode();
        ftp.setBufferSize(100000);
        ftp.setConnectTimeout(1200000);
        ftp.setDataTimeout(1200000);
        ftp.setDefaultTimeout(1200000);

【讨论】:

    猜你喜欢
    • 2023-04-06
    • 2010-12-01
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    相关资源
    最近更新 更多