2012-04-27 132 views
4

我正在開發一個使用SSHJ進行SFTP傳輸的庫。 由於請求頻繁,我想知道是否可以保持連接打開。如何使用SSHJ保持SSH連接的活躍?

顯然,如果服務器頻繁超時連接,這將無法實現。 因爲我無法控制服務器,所以必須保持連接處於活動狀態: 使用常規的SSH客戶端,我可以指定一個ServerAliveInterval並讓客戶端爲我執行此操作。

我想對SSHJ做同樣的事情,但我不知道要發送什麼消息。

SSH manual只是指出ServerAliveInterval

在幾秒鐘之後,如果沒有數據被從所述服務器接收到的,SSH(1)將發送信息通過加密信道以請求響應設置超時間隔從服務器。

所以我想知道: 什麼消息發送?我怎麼能通過SSHJ重現這個消息?

回答

6
+0

萬一鏈接斷裂或變化,行是client.getTransport()。setHeartbeatInterval(30); – Scott 2013-04-12 20:05:35

+1

它確實已經壞了。 – 2015-06-17 01:17:58

+0

當前版本爲0.23.0,應該是'sshClient.getConnection.getKeepAlive.setKeepAliveInterval(15)'。 – LoranceChen 2018-02-26 08:34:23

2

從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