有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么SSHJ的最大写入大小是32KB?

我一直在使用SSHJ将文件写入我的远程SFTP服务器。目前的设置是我有一个Spring批处理ItemWriter,它可以将数据块任意写入一个文件。Jsch不支持此功能,就好像块的顺序不正确一样,然后文件会因为块的顺序不正确而损坏,这就是我转向SSHJ的原因

问题在于数据块的大小。当前,任何大于32KB的大小都会立即中断传输,但以下情况除外

net.schmizz.sshj.connection.ConnectionException: Timeout when trying to expand the window size

我的目标是尽可能提高文件传输的吞吐量,通常通过增加窗口大小或数据包大小来实现。问题是,尽管客户端和socket都在增加,但我得到了以下异常

在读取SSH RFC之后,它指出最大窗口大小可以达到`2^32-1,大致等于4.29GB。因此,如果我将缓冲区大小和窗口大小设置为最大可能的2^32-1,则传输应该可以工作,但出现了上述异常

以下是当前的客户端配置

    SSHClient sshClient = new SSHClient();
    Connection conn = sshClient.getConnection();
    conn.setWindowSize(dataChunkSize);
    sshClient.addHostKeyVerifier(new PromiscuousVerifier());
    sshClient.connect(destCredUri[0], Integer.parseInt(destCredUri[1]));
    Socket socket = sshClient.getSocket();
    socket.setTcpNoDelay(true);
    socket.setKeepAlive(true);
    socket.setSendBufferSize(Math.toIntExact(dataChunkSize));
    socket.setReceiveBufferSize(Math.toIntExact(dataChunkSize));

如何将块大小增加到32KB以上?另一方面,任何关于通过SFTP实现吞吐量最大化的建议都是令人惊讶的

事先非常感谢


共 (0) 个答案