3つのボタンを持つFXML JavaFXシーンがあります。2番目のボタンをクリックするとJavaFXのシーンがフリーズします
ボタン1:Telnetで、command1 +と入力すると、JavaFXシーンのTextAreaにTelnetセッションが出力されます。
ボタン2:Telnet、command2 +と入力すると、JavaFXシーンのTextAreaにTelnetセッションが出力されます。
ボタン3:Telnet、command3 +と入力すると、JavaFXシーンのTextAreaにTelnetセッションが出力されます。
問題は、ボタンをクリックした後、2番目のボタンをクリックするとJavaFXシーンがフリーズすることです。
私は既にTelnetセッションの出力をコンソールにリダイレクトしましたが、これは同じ結果をもたらします。
(110)oxea>#yを
(110)oxea>が、それは明らかに最後である#yをプロンプトである: これは、コンソール内の最後の出力であります文字が送信されました。
ボタンからTelnetアクションを削除すると、Telnetアクションで別のものをクリックした後にこのボタンをクリックしても問題ありません。
プログラムをコンパイルすると同じ問題が発生します。
コンパイルした後、プログラムを2回同時に実行しました。最初のプログラムのボタンをクリックすると、ボタンをクリックすると2番目のプログラムimmediatleyがフリーズします。
例外がスローされず、この問題を説明し解決するトピックが見つかりません。
はFXMLController:ボタンをクリックしたときに
@FXML private Text buttonPressed;
@FXML private Button button1;
@FXML private Button button2;
@FXML public TextArea actionConsole;
@FXML
private void initialize() {
button1.setOnAction((event) -> {
buttonPressed.setText("");
buttonPressed.setText("button1 pressed");
actionConsole.clear();
TelnetSRV t1 = new TelnetSRV("0.0.0.0", "user", "password", "ls -l");
});
button2.setOnAction((event) -> {
buttonPressed.setText("");
buttonPressed.setText("button1 pressed");
actionConsole.clear();
TelnetSRV t2 = new TelnetSRV("0.0.0.0", "user", "password", "df -h");
はそう、テキストが表示され、TextAreaのactionConsoelがクリアされ、TelnetSRVが行われます。これは最初のクリックでは機能しますが、2回目のクリックでプログラムがフリーズします。
2つのTelnetSRVを持つ別のクラスを実行すると、これも最初のTelnetSRVの後でフリーズするため、TelnetSRVクラスにはほとんど間違いがあります。
TelnetSRV:
public class TelnetSRV {
private TelnetClient tc = new TelnetClient();
private InputStream in;
private PrintStream out;
private String prompt = "(110)oxea>";
public TelnetSRV(String server, String user, String password, String command) {
try {
tc.connect(server, 23);
in = tc.getInputStream();
out = new PrintStream(tc.getOutputStream());
readUntil("login: ");
write(user);
readUntil("Password: ");
write(user);
readUntil(prompt + " ");
write(command);
readUntil(prompt + " ");
tc.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
public String readUntil(String pattern) {
try {
char lastChar = pattern.charAt(pattern.length() - 1);
StringBuffer sb = new StringBuffer();
boolean found = false;
char ch = (char) in.read();
while (true) {
System.out.print(ch);
sb.append(ch);
if (ch == lastChar) {
if (sb.toString().endsWith(pattern)) {
return sb.toString();
}
}
ch = (char) in.read();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void write(String value) {
try {
out.println(value);
out.flush();
System.out.println(value);
} catch (Exception e) {
e.printStackTrace();
}
}
}
おそらくサーバーに接続できず、UIがフリーズしている可能性があります。おそらく、タイムアウトを設定し、UIとは別のスレッドで接続を実行する可能性があります。 – luckydog32
こんにちは、 私は接続することができます、私は最初のTelnetセッションの出力を見ることができます。 2番目のTelnetセッションは、同じサーバー(同じユーザー、同じパスワード)へのセッションです。 – ESDEE
2番目のセッションが接続しようとしていることを確認するためにtcpdumpを実行します。 – ESDEE