使用 Apache FTPClient 和 Java 流并行下载多个 FTP 文件失败,并显示“套接字写入错误”或“无法解析响应代码”

问题描述 投票:0回答:1

如何从不同目录的 FTP 检索文件名 - 看起来像 FTP 关闭连接,如果检测到洪水请求

代码很简单

public List<String> getPaths(String path, LocalDate date)  {
    try {
        val listFiles = ftp.listFiles(path);
        return Arrays.stream(listFiles)
                .parallel()
                .filter(f->f.getTimestamp().getTime().toInstant().isAfter(date.atStartOfDay(ZoneId.systemDefault()).toInstant()))
                .map(FTPFile::getName)
                .collect(Collectors.toList());
    } catch (IOException e) {
        e.printStackTrace();
        return Collections.emptyList();
    }
}

public List<String> getPurchaseList(LocalDate date) {
    try (FTPClientWrapper wrapper = new FTPClientWrapper(
            host, port, login, password)

    ) {
        wrapper.connect();
        val regionList = wrapper.readFile(dir, fileName);
        val dirList = regionList.stream()
                .flatMap(x -> purchaseTypes.stream().map(y -> String.format("%s/%s/%s/%s", dir, x, y, folder)))
                .collect(Collectors.toList());

        return dirList.stream().flatMap(d -> wrapper.getPaths(d, date).stream())
                .collect(Collectors.toList());
    } catch (IOException e) {
        e.printStackTrace();
        return Collections.singletonList(e.getMessage());
    }
}

如果我打电话给

getPurchaseList
如果失败:

SocketException:连接被对等方重置:套接字写入错误

如果我在

parallelStream
使用
regionList.stream
则会失败:

org.apache.commons.net.MalformedServerReplyException:无法解析响应代码。
服务器回复:e227 进入被动模式 (95,167,245,94,117,237)

有没有办法解析FTP的1000+目录还是不可能?

我使用 Apache Commons Net FTP 客户端。

java ftp java-io apache-commons-net
1个回答
1
投票

您无法使用 FTP 协议通过一个连接并行下载多个文件。一般来说,您不能从多个线程并行使用一个连接来执行任何操作。

您必须为每个线程打开单独的连接。在您的情况下,您将需要实现一个连接池。

© www.soinside.com 2019 - 2024. All rights reserved.