2017-10-30 7 views
0

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(); 
     } 
    } 
} 
+0

おそらくサーバーに接続できず、UIがフリーズしている可能性があります。おそらく、タイムアウトを設定し、UIとは別のスレッドで接続を実行する可能性があります。 – luckydog32

+0

こんにちは、 私は接続することができます、私は最初のTelnetセッションの出力を見ることができます。 2番目のTelnetセッションは、同じサーバー(同じユーザー、同じパスワード)へのセッションです。 – ESDEE

+0

2番目のセッションが接続しようとしていることを確認するためにtcpdumpを実行します。 – ESDEE

答えて

1

私のTelnetトレースは私に私のコードはOKだったアイデアを与えたので、私はたtelnetClient上のバグレポートを探し始めました。

私は、問題が、私が使用したApache common-netライブラリに起因することを発見しました。

私はcommons-net-3.0.1をcommons-net-3.6に置き換えました.2つのtelnetセッションは問題なく実行されます。

ありがとうございました

+0

あなた自身の答えを受け入れて、問題が解決したことを他の人が分かるようにしてください。 – robinCTS

+1

私は2日後に自分のanwserを受け入れることができます。 – ESDEE

+0

申し訳ありません。私はあなたがそれをもっと早くできると思った:) – robinCTS

関連する問題