1

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

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

这一切都很好。但是,我的问题在于其中的断开连接部分。

我有一个名为 WinConnect 的 Public Void,如果单击了连接按钮并且如上所述作为线程工作,则会触发此操作。

在断开连接按钮上我试过:

相关按钮代码的当前部分

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

}

  • 会话 session.disconnect(); //说是预期的;并且找不到符号方法断开连接

  • 会话.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);
}    

}

public class RemoteDesktop extends javax.swing.JFrame {
private Session session;
private Channel channel;

编辑:猜猜是因为变量 Session 在 winconnect 中而不是在它找不到的按钮中?

Edit2:在尝试下面的建议后,它只是在单击断开连接时锁定

编辑3:正确的新代码应该可以工作,但是如果我调用 session.delPortForwardingL(7051); 似乎 session.disconnect 有问题;它可以工作,但我不确定连接是否仍然有效,不确定为什么 session.disconnect 没有!

Edit4:检查了服务器并且连接仍然存在,它只是删除了我的 VNC 的转发停止,不好:(

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

4

1 回答 1

1

因为您确实只发布了一段源代码,所以我只能猜测。根据错误消息,问题是该方法.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();
     }
   });  
   ...
  }
}

如果你愿意,你可以对我的回答投反对票。请记住,此时您还没有发布足够的源代码。所以我只能猜测。

于 2013-09-13T11:19:31.500 回答