我正在开发一个使用 SSHJ 进行 SFTP 传输的库。由于请求频繁,我想知道我是否可以保持连接打开。
显然,如果服务器频繁使连接超时,这将一无所获。由于我无法控制服务器,因此我必须保持连接处于活动状态:使用常规 SSH 客户端,我可以指定一个ServerAliveInterval
并让客户端为我完成。
我想对 SSHJ 做同样的事情,但我不知道要发送什么消息。
SSH手册只是指出ServerAliveInterval
设置一个超时间隔(以秒为单位),如果服务器没有收到任何数据, ssh(1) 将通过加密通道发送消息,请求服务器响应。
所以我想知道:发送什么消息?如何通过 SSHJ 重现此消息?
这没有记录,但您可以设置心跳:
https://github.com/hierynomus/sshj/blob/master/examples/src/main/java/net/schmizz/sshj/examples/RemotePF.java#L51
从版本 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
。