1

私はここ数週間、Java を独学で学んできました (おそらく何か間違ったことをしている可能性があります)。

データベース リストの場所に接続する簡単なプログラムを開発しました。JSCH を使用してトンネルをセットアップすることで、それらに接続できます。だから私はそれにVNCすることができます。

これはすべてうまくいきます。ただし、私の問題は、これの切断部分にあります。

私は WinConnect と呼ばれる Public Void を持っています。これは、接続用のボタンがクリックされた場合に起動され、上記のようにスレッドとして機能します。

私が試した切断ボタンで:

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

}

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

編集:変数セッションがボタンではなくwinconnectにあるため、それを見つけることができないと思いますか?

Edit2:以下の提案を試した後、切断をクリックするとロックされます

Edit3:新しいコードは正常に機能するはずですが、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 に答える