5

我正在开发一个使用 SSHJ 进行 SFTP 传输的库。由于请求很频繁,我想知道是否可以保持连接打开。

显然,如果服务器经常超时连接,这将一事无成。由于我无法控制服务器,因此我必须保持连接处于活动状态:使用常规 SSH 客户端,我可以指定 aServerAliveInterval并让客户端为我执行此操作。

我想对 SSHJ 做同样的事情,但我不知道要发送什么消息。

SSH手册只是指出ServerAliveInterval

以秒为单位设置超时间隔,如果在此之后没有从服务器接收到数据,ssh(1) 将通过加密通道发送消息以请求服务器响应。

所以我想知道:发送了什么消息?如何通过 SSHJ 重现此消息?

4

2 回答 2

7

抱歉,这没有记录,但您可以设置心跳:

https://github.com/hierynomus/sshj/blob/master/examples/src/main/java/net/schmizz/sshj/examples/RemotePF.java#L51

于 2012-05-14T14:13:43.137 回答
3

从 0.11.0 版本开始,您可以使用内置的 KeepAliveProvider

public class KeepAlive {

    public static void main(String... args)
            throws IOException, InterruptedException {
        DefaultConfig defaultConfig = new DefaultConfig();
        defaultConfig.setKeepAliveProvider(KeepAliveProvider.KEEP_ALIVE);
        final SSHClient ssh = new SSHClient(defaultConfig);
        try {
            ssh.addHostKeyVerifier(new PromiscuousVerifier());
            ssh.connect(args[0]);
            ssh.getConnection().getKeepAlive().setKeepAliveInterval(5); //every 60sec
            ssh.authPassword(args[1], args[2]);
            Session session = ssh.startSession();
            session.allocateDefaultPTY();
            new CountDownLatch(1).await();
            try {
                session.allocateDefaultPTY();
            } finally {
                session.close();
            }
        } finally {
            ssh.disconnect();
        }
    }
}

要发送心跳,您可以使用KeepAliveProvider.HEARTBEAT.

于 2015-06-20T11:36:49.550 回答