2016-08-02 74 views
0

我試圖構建一個基於Jframe的SSH客戶端。我已連接客戶端,並將輸出流傳送到JTextArea。將JSch Channel InputStream連接到JTextField框,不發送命令

問題出在用戶輸入,取自JTextArea下面的JTextField,當用戶按下輸入併發送到服務器時讀取。

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

}

該類擴展的InputStream,並監聽用戶按下回車鍵。從那裏它讀取JTextField的內容,並且(希望)將其設置爲'內容',當非空白時由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."); 

服務器功能細(見下文截圖),並且當輸入的命令和返回鍵按下時,將TextField復位其內容的輸出流。但是這個命令不會被髮送到服務器(通過運行mkdir Testing ect測試)。

任何意見,將不勝感激。如果您想要完整的代碼示例,可以在https://github.com/ElliotAlexander/SSH-Connect-GUI找到。不執行

The connected terminal output

回答

0

您發送到遠程服務器的命令,因爲它們不是由一個換行符終止。

您的代碼只發送輸入字段的文本,但換行符會被代碼「吞併」。爲了解決這個問題,只需在字節緩衝區附加一個換行符。另外,我認爲擴展InputStream類的方式會導致一些問題,因爲read方法只能由Jsch通道調用一次。

我建議使用一對管道流對象來代替。您將需要初始化它們在ConsoleWindow並傳遞到InputArea和渠道:

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

最後,寫你的命令的輸出流:

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

這並沒有什麼差別,該命令還沒有到達服務器。 –

+0

我已更新我的解決方案。 –