如何使用SSHJ保持SSH连接存活?

时间:2012-04-27 13:25:35

标签: java ssh timeout sshj

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

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

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

SSH manual只是声明ServerAliveInterval

  

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

所以我想知道: 发送了什么消息?我怎么能通过SSHJ重现这个消息?

2 个答案:

答案 0 :(得分:6)

答案 1 :(得分:3)

从版本0.11.0开始,您可以use built-in 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