1

org.apache.commons.net.telnet.TelnetClientを使用してJavaでTelnetコードを使用しています

そして、私は以下のコードを介してtelnetサーバーから「login:」を読んでログイン情報を提供しています。

    in = telnet.getInputStream();
    char lastChar = pattern.charAt(pattern.length()-1);
    StringBuffer sb = new StringBuffer();

    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();
       i++;
       // System.out.print(i);
    }

しかし、「username:」などのプロンプトを表示する無効なtelnetサーバーを指定すると、「in.read();」で「login:」を待機する無限ループが発生します。

in.read()で待機しているため、while(_flag)でもフラグなどを使用できません。アプリケーションが無効なログインを受け取ったときに無限ループを回避するための解決策を誰かが私に提供できますか?

4

2 に答える 2

1
  1. 希望の時間後に終了する別のスレッドを作成します。

  2. boolean変数をフラグ、whileループ、およびとして使用して、この別のスレッドを制御する必要がありbreakます。

  3. telnet への接続が成功したときに戻るメソッドでこのフラグを true に設定すると、breakその別のスレッド内でループします。

  4. これが規定時間内に発生しない場合、その別のスレッドが を実行するSystem.exit(0)ため、プログラムは終了します。

于 2012-08-12T15:23:21.060 に答える
1

成功基準 (telnet server send login:) はありますが、失敗基準はありません。したがって、ループは永遠に実行される可能性があります。

失敗時にループを壊すにはどうすればよいですか? 条件を考えてみましょう。たぶん: 「20 秒間試してください」または「login:最初の 100 文字以内に送信されていません」。

行ごとに読んで、サーバーが(特定の時間間隔内に)送信する最初の行が と等しいことを期待することもできますlogin:。そうでない場合は、エラーメッセージで終了します(あなたの場合はそうします)

于 2012-08-12T15:23:46.583 に答える