2016-08-02 4 views
0

JframeベースのSSHクライアントを構築しようとしています。クライアントを接続し、出力ストリームをJTextAreaにパイプします。JSch Channel InputStreamをJTextFieldボックスに接続すると、コマンドが送信されない

問題はユーザー入力にあり、JTextAreaの下のJTextFieldから取得し、ユーザーがEnterキーを押してサーバーに送信したときに読み取られます。

public class InputArea extends InputStream { 

byte[] contents; 
int pointer = 0; 


public InputArea(JTextField inputarea) { 

    TextPrompt consoleTp = new TextPrompt(">> ", inputarea); 
    consoleTp.setShow(TextPrompt.Show.FOCUS_LOST); 
    inputarea.setPreferredSize(new Dimension(560, 40)); 
    inputarea.setVisible(true); 
    // Fire listener for input area when enter key is pressed . 
    inputarea.addKeyListener(new KeyAdapter() { 
     @Override 
     public void keyReleased(KeyEvent e) { 
      if (e.getKeyChar() == '\n') { 
       contents = inputarea.getText().getBytes(); 
       pointer = 0; 
       inputarea.setText(""); 
      } 
      super.keyReleased(e); 
     } 
    }); 
} 

@Override 
public int read() throws IOException { 
    if (pointer >= contents.length) return -1; 
    return this.contents[pointer++]; 
} 

}

このクラスは入力ストリームを拡張し、Enterキーを押下リッスン。そこからJTextFieldの内容が読み込まれ、(うまくいけば)これが 'contents'に設定されます。これは空でないときにInputStreamによって読み込まれます。

そこから、コンソールウィンドウのメインJFrameクラスにあります。

// 
    // Configure input area 
    // 
    JTextField inputTextField = new JTextField(); 
    in = new InputArea(inputTextField); 
    add(inputTextField); 

次に、SSHサーバーに接続する方法で、

セッションセッション= jsch.getSession(user、host、port);

 // Disable key checking 
     java.util.Properties config = new java.util.Properties(); 
     config.put("StrictHostKeyChecking", "no"); 
     session.setConfig(config); 

     session.setPassword(String.valueOf(password)); 
     System.out.println("Attempting to connect to " + host + " on port " + port + " ...."); 
     session.connect(3000); 


     Channel channel = session.openChannel("shell"); 
     channel.setInputStream(in); 
     channel.setOutputStream(out); 
     channel.connect(3000); 
     System.out.println("Connected."); 

細かいサーバ機能の出力ストリーム(下のスクリーンショットを参照)、コマンドを入力し、リターンキーを押したときに、テキストフィールドにその内容をリセットします。ただし、このコマンドはサーバーに送信されません(mkdir Testing ectを実行してテストされます)。

アドバイスをいただければ幸いです。完全なコードサンプルが必要な場合はhttps://github.com/ElliotAlexander/SSH-Connect-GUIにあります。彼らは改行文字で終了されていないため、リモートサーバに送信

The connected terminal output

答えて

0

のコマンドは実行されません。

コードは入力フィールドのテキストのみを送信しますが、改行文字はコードによって「飲み込まれます」。これを修正するには、改行文字をバイトバッファに追加するだけです。さらに、私はあなたがInputStreamクラスを拡張する方法はいくつかの問題を引き起こしていると思います。なぜなら、readメソッドはJschチャンネルで一度しか呼び出されないからです。

代わりにパイプのストリームオブジェクトのペアを使用することをお勧めします。あなたはConsoleWindowでそれらを初期化する必要があるとInputAreaおよびチャネルに渡します:まだコマンド、これは任意の違いはありませんでした

public InputArea(final JTextField inputarea, final PipedOutputStream pout) { 
    ... 
    public void keyReleased(KeyEvent e) { 
     if (e.getKeyChar() == '\n') { 
      byte[] tmp = inputarea.getText().getBytes(); 
      pout.write(tmp, 0, tmp.length); 
      pout.write('\n'); 
      ... 
     } 
     ... 
    } 
} 
+0

private PipedInputStream pin; private PipedOutputStream pout; public ConsoleWindow(...) { pin = new PipedInputStream(); pout = new PipedOutputStream(pin); // InputArea no longer needs to extend InputStream in = new InputArea(inputTextField, pout); ... } private void SSHConnect() { ... channel.setInputStream(pin); ... } 

最後に、あなたのコマンドは、出力ストリームを書きますサーバーに到達していません。 –

+0

解決策を更新しました。 –

関連する問題