1. 程式人生 > >com.jcraft.jsch.JSchException: channel is not opened解決方案

com.jcraft.jsch.JSchException: channel is not opened解決方案

在一個批量下載檔案的程式時,發現下載的檔案出錯,最多隻能下載10個檔案,剩下的檔案丟失了,檢視程式碼,也沒有邏輯上的錯誤,下載丟失也沒報錯
考慮到之前出現過前臺頁面傳入後臺的值丟失,然後在後臺對前臺輸入的資訊進行println,發現數據未丟失,也未傳2次而多出null,

Session session = connection.getSession(user, ip, port);
 ChannelExec channelExec = (ChannelExec) session.openChannel("exec");
 channelExec.setCommand(cmd);
 channelExec.setInputStream
(null); channelExec.setErrStream(System.err); channelExec.connect();

然後使用try,catch進行捕捉,檢視日誌發現在下載第十一個檔案的時候總是失敗
錯誤資訊com.jcraft.jsch.JSchException: channel is not opened.,
可能原因預設的session時間有限制,然後對session時間進行獲取

  println("session timeout" + session.getTimeout())

獲取到的session時間是0,發現沒什麼問題,然後設定了一個長一點的時間試試

  session.setTimeout(600000);

問題並沒有解決
也可能是環境有問題,檢視一下配置檔案,可能是session有限制
這裡寫圖片描述

檢視sshd_config

這裡寫圖片描述

在配置檔案中有MaxSessions,原來是10,我把它改成了20,並去掉了“#”符號,儲存後重啟

這裡寫圖片描述

然後重新執行工程,發現這次下載的是20個檔案,沒有丟失,又多試了幾次,效果很理想,問題算是解決了吧,原來這裡MaxSession預設是的10,所以只能最多連線10次。

//———————————————————————-

上述方法可以解決這個問題,但不是最好的,在原來的程式碼裡存在bug,在這個方法裡呼叫的另一個方法,只有開啟,沒有關閉,所以導致上述問題

 Channel channel = session.openChannel("sftp")
 channel.disconnect();//新增關閉