我試圖構建一個基於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找到。不執行
這並沒有什麼差別,該命令還沒有到達服務器。 –
我已更新我的解決方案。 –