Java JSch-如何确定会话是否已打开?
我有一个runnable,可以建立SSH连接并将文件从服务器传输到本地。问题是,我无法正确判断是否已经有活动会话正在进行。每次运行下面的代码时,getSession的值都是null。我不知道我哪里出了问题,在过去的几个小时里我一直在盯着这个代码。感谢您的帮助 另一方面,我还需要弄清楚如何关闭另一个类的连接,即用户单击以关闭连接的主活动中的MenuItem。因为我甚至不知道如何获得JSch的当前会话,所以这有点超出了我的能力范围。在此方面的任何帮助也将不胜感激。 我的代码如下:Java JSch-如何确定会话是否已打开?,java,eclipse,ssh,jsch,Java,Eclipse,Ssh,Jsch,我有一个runnable,可以建立SSH连接并将文件从服务器传输到本地。问题是,我无法正确判断是否已经有活动会话正在进行。每次运行下面的代码时,getSession的值都是null。我不知道我哪里出了问题,在过去的几个小时里我一直在盯着这个代码。感谢您的帮助 另一方面,我还需要弄清楚如何关闭另一个类的连接,即用户单击以关闭连接的主活动中的MenuItem。因为我甚至不知道如何获得JSch的当前会话,所以这有点超出了我的能力范围。在此方面的任何帮助也将不胜感激。 我的代码如下: import co
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;
public class SCPReceive implements Runnable {
private JSch jsch;
private ChannelSftp sftpChannel;
private Session session;
private String username;
private String password;
private String host;
private int port;
private volatile static SCPReceive instance = null;
SCPReceive() {
this.jsch = new JSch();
this.username = "username";
this.password = "password";
this.host = "server.com";
this.port = 22;
}
public static SCPReceive getInstance() {
if (SCPReceive.instance == null) {
synchronized (SCPReceive.class) {
if (SCPReceive.instance == null) {
SCPReceive.instance = new SCPReceive();
}
}
}
return SCPReceive.instance;
}
public void run() {
if (null == getSession() || !getSession().isConnected()) {
try {
System.out.println("Opening SFTP Connection");
setSession(jsch.getSession(this.username, this.host, this.port));
getSession().setConfig("StrictHostKeyChecking", "no");
getSession().setPassword(this.password);
getSession().connect();
Channel channel = getSession().openChannel("sftp");
channel.connect();
setSftpChannel((ChannelSftp) channel);
} catch(Exception e){
System.out.println("Error on connecting to server: " + e);
}
try {
get();
} catch (SftpException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
System.out.println("SFTP Connection already open");
}
System.out.println("Success");
}
public void closeConnection() {
System.out.println("Closing SFTP connection");
getSftpChannel().exit();
getSession().disconnect();
System.out.println("SFTP Connection closed");
}
public boolean isOpen() {
if (getSession().isConnected()) {
return true;
} else {
return false;
}
}
private ChannelSftp getSftpChannel() {
return this.sftpChannel;
}
private Session getSession() {
return this.session;
}
private void setSftpChannel(ChannelSftp sftpChannel) {
this.sftpChannel = sftpChannel;
}
private void setSession(Session session) {
this.session = session;
}
public void get() throws SftpException {
String remote = "/path/to/file/1.mp4";
String local = "/save/path/to/f1le/1.mp4";
System.out.println("Retrieving file: " + remote + " saving to: " + local);
getSftpChannel().get(remote, local);
System.out.println("Success");
}
}
编辑:
runnable通过以下方式调用:
@Override
public void actionPerformed(ActionEvent e) {
SCPReceive t = new SCPReceive();
Thread SCPReceive_thread = new Thread(t);
SCPReceive_thread.start();
}
});
如何调用此类?@Override public void actionPerformedActionEvent e{scprective t=new scprective;Thread scprective\u Thread=new Threadt;scprective\u Thread.start;};