Java JSch-如何确定会话是否已打开?

Java JSch-如何确定会话是否已打开?,java,eclipse,ssh,jsch,Java,Eclipse,Ssh,Jsch,我有一个runnable,可以建立SSH连接并将文件从服务器传输到本地。问题是,我无法正确判断是否已经有活动会话正在进行。每次运行下面的代码时,getSession的值都是null。我不知道我哪里出了问题,在过去的几个小时里我一直在盯着这个代码。感谢您的帮助 另一方面,我还需要弄清楚如何关闭另一个类的连接,即用户单击以关闭连接的主活动中的MenuItem。因为我甚至不知道如何获得JSch的当前会话,所以这有点超出了我的能力范围。在此方面的任何帮助也将不胜感激。 我的代码如下: import co

我有一个runnable,可以建立SSH连接并将文件从服务器传输到本地。问题是,我无法正确判断是否已经有活动会话正在进行。每次运行下面的代码时,getSession的值都是null。我不知道我哪里出了问题,在过去的几个小时里我一直在盯着这个代码。感谢您的帮助

另一方面,我还需要弄清楚如何关闭另一个类的连接,即用户单击以关闭连接的主活动中的MenuItem。因为我甚至不知道如何获得JSch的当前会话,所以这有点超出了我的能力范围。在此方面的任何帮助也将不胜感激。 我的代码如下:

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;};