Java JSch断开按钮

Java JSch断开按钮,java,netbeans,jsch,Java,Netbeans,Jsch,在过去的几周里,我一直在自学Java(很可能是做错了什么) 我开发了一个简单的程序,可以连接到一个列出位置的数据库。我可以连接到它们,使用JSCH建立一个隧道。所以我可以用VNC来记录它 这一切都很好。然而,我的问题在于这其中的脱节部分 我有一个名为WinConnect的公共空白,如果点击了连接按钮,并且如上所述作为线程工作,则会触发该漏洞 在断开按钮上,我尝试: relivant按钮代码的当前部分 private void jButtonDisconnectActionPerformed(ja

在过去的几周里,我一直在自学Java(很可能是做错了什么)

我开发了一个简单的程序,可以连接到一个列出位置的数据库。我可以连接到它们,使用JSCH建立一个隧道。所以我可以用VNC来记录它

这一切都很好。然而,我的问题在于这其中的脱节部分

我有一个名为WinConnect的公共空白,如果点击了连接按钮,并且如上所述作为线程工作,则会触发该漏洞

在断开按钮上,我尝试:

relivant按钮代码的当前部分

private void jButtonDisconnectActionPerformed(java.awt.event.ActionEvent evt) {                                                  
    this.channel.disconnect();
    this.session.disconnect(); 
}

  • Session.disconnect()//说期待;并且找不到符号 方法断开

  • Session.Session.disconnect()//这表示找不到可变会话

  • JSch.session.disconnect//这表示找不到可变会话

诸如此类,他们都不工作。Netbeans表示代码中存在错误。显然,我缺乏知识意味着我做错了什么,可能是一些显而易见的事情

所有WinConnect:

 private void WinConnect(){
  String SshPortNumb = (String)SshPort.getSelectedItem();
  int SshPortNum = Integer.parseInt(SshPortNumb);
  String PcIpNum = (String)PcIp.getText();
  String host = (String)SiteIp.getText();
  String VncPortNumb = VncPort.getText();
  int VncPortNum = Integer.parseInt(VncPortNumb);
  String user = (String)UserName.getText();
  String PasswordVal = (String)Password.getText();
  String VncPathpre = VncPath.getText();
  String VncPathdat = "\""+VncPathpre+"\"";

try{
  JSch jsch=new JSch();

  jsch.setKnownHosts("known_hosts");


  this.session=jsch.getSession(user, host, SshPortNum);

  String passwd = PasswordVal;
  this.session.setPassword(passwd);

  UserInfo ui = new MyUserInfo(){
    public void showMessage(String message){
      JOptionPane.showMessageDialog(null, message);
    }
    public boolean promptYesNo(String message){
      Object[] options={ "yes", "no" };
      int foo=JOptionPane.showOptionDialog(null, 
                                           message,
                                           "Warning", 
                                           JOptionPane.DEFAULT_OPTION, 
                                           JOptionPane.WARNING_MESSAGE,
                                           null, options, options[0]);
      return foo==0;
    }

  };
jButtonDisconnect.setEnabled(true);
jButtonConnect.setEnabled(false);
  this.session.setUserInfo(ui);

  this.session.connect(30000);  

  this.session.setPortForwardingL(7051, PcIpNum, VncPortNum);

  this.channel=session.openChannel("shell");

  this.channel.setInputStream(System.in);

  this.channel.setOutputStream(System.out);

  this.channel.connect(3*1000);

}
catch(Exception e){
  System.out.println(e);
}    
}

编辑:猜测,因为可变会话在winconnect中,而不是按钮中,所以无法找到它

编辑2:尝试下面的建议后,单击“断开连接”时,它会锁定

Edit3:对,新代码应该可以工作,但是session.disconnect似乎有问题,如果我调用session.delPortForwardingL(7051);它可以工作,但我不确定连接是否仍然处于活动状态,不确定session.disconnect为什么不能工作

Edit4:已检查服务器,且连接仍在原位。它只是删除了前进停止标记我的VNC,不好:(


Edit5:检查调用session.disconnect是否确实有效,但是它会由于某种原因导致我的程序锁定

因为你只发布了一段源代码,我只能猜测。根据错误消息,问题是该方法
.addActionListener()
创建自己的变量作用域。因此您没有访问父上下文的权限

尝试将变量
Session Session
移动到全局范围,如下所示:

public class YourJavaClass
{
  private Session session;

  public static void main()
  {
    ...
  }

  private void connect(String location)
  {
   try
   {
     JSch jsch=new JSch();

     jsch.setKnownHosts(location);

     this.session=jsch.getSession(user, host, SshPortNum);

     String passwd = PasswordVal;
     this.session.setPassword(passwd);
     this.session.connect(30000);  

     session.setPortForwardingL(7051, PcIpNum, VncPortNum);
  }

  private void yourGuiMethod()
  {
   ...
   jButtonDisconnect.addActionListener(new ActionListener()
   {
     public void jButtonDisconnectActionPerformed(java.awt.event.ActionEvent evt)
     {
        this.session.disconnect();
     }
   });  
   ...
  }
}

如果你愿意,你可以投票否决我的答案。不过请记住,目前你还没有发布足够的源代码。所以我只能猜测。

因为你只发布了一段源代码,所以我只能猜测。根据错误消息,问题是该方法
.addActionListener()
创建自己的变量作用域。因此您没有访问父上下文的权限

尝试将变量
Session Session
移动到全局范围,如下所示:

public class YourJavaClass
{
  private Session session;

  public static void main()
  {
    ...
  }

  private void connect(String location)
  {
   try
   {
     JSch jsch=new JSch();

     jsch.setKnownHosts(location);

     this.session=jsch.getSession(user, host, SshPortNum);

     String passwd = PasswordVal;
     this.session.setPassword(passwd);
     this.session.connect(30000);  

     session.setPortForwardingL(7051, PcIpNum, VncPortNum);
  }

  private void yourGuiMethod()
  {
   ...
   jButtonDisconnect.addActionListener(new ActionListener()
   {
     public void jButtonDisconnectActionPerformed(java.awt.event.ActionEvent evt)
     {
        this.session.disconnect();
     }
   });  
   ...
  }
}

如果你愿意,你可以投票否决我的答案。不过请记住,目前你还没有发布足够的源代码。所以我只能猜测。

可以提供更多的源代码吗?消息的错误文本是什么,来自Netbeans?我添加了更多的位,但没有更多的位需要添加。我想我显然错过了一些重要的内容可以提供更多的源代码吗?消息的错误文本是什么,来自Netbeans?我添加了更多的位,但没有更多的要添加我想我显然缺少一些主要的东西来让它工作你想看到什么部分,我可以把它全部放进去,但是有很多代码大部分是不相关的。我已经作为abo进行了测试当使用Java点击Disconnect时,它似乎可以毫无错误地锁定GUI。你可以创建一个复杂的代码结构。因此,初学者可能会被很多陷阱抓住。事实上,在我学习Java的过程中,谷歌搜索没有停止过!最糟糕的是,我使用cmd提示符和plink进行了工作,但这不是多平台的which是我改用JSch的原因,如果我能更好地理解它会更好:)看来断开会话是锁定我的程序的原因,但不确定为什么:(好的,你建议的工作是一种享受,非常感谢你使用我有限的代码,在做了你建议的工作之后,它引发了另一个问题,这个问题与你给我的不一致,但我在另一个问题上找到了答案,你希望看到什么部分,我可以把它全部投入其中,但是有很多代码大部分是不合适的。我有正如上面测试的那样,当使用Java点击Disconnect时,它似乎可以毫无错误地锁定GUI。你可以创建一个复杂的代码结构。因此,初学者可能会被很多陷阱抓住。事实上,在我学习Java的过程中,谷歌搜索没有停止过!最糟糕的是,我让它使用cmd提示符和plink工作,但这不是mult这就是为什么我改用JSch的原因,如果我能更好地理解它会更好:)看来断开会话是锁定我的程序的原因不确定为什么:(对了,你建议的工作是一种享受,非常感谢你使用我有限的代码,在做了你建议的工作之后,它引发了另一个问题,这个问题与你给我的不一致,但我在另一个问题上找到了答案