0

apache の telnet クライアントから入力ストリームを取得しています。コマンドを telnet クライアントに送信するたびに、ターミナル出力が InputStream に書き戻されますが、このストリームは telnet セッションまで開いたままです。

ここで、このストリームのデータを最後まで読み取る方法が必要です。問題は、ストリームが常に開いているため、特定できないことです。私が見つけた回避策の 1 つは、特定の文字が検出されるまでデータを読み取ることでした (これはプロンプトです)。ほとんどの場合)しかし、プロンプトはコマンドに基づいて変化し続け、コマンドの実行後にそれがどうなるかを知る方法がありません。

SOには同様の質問があり、それをよりよく説明していますが、答えはありません:

InputStream の問題

助けてください...

4

2 に答える 2

0

最後にタイムアウトを使用しました。基本的に、文字が1秒間使用できない場合はあきらめました。inputStream.read()の代わりに、これを使用しました:

private char readChar(final InputStream in){
        ExecutorService executor = Executors.newFixedThreadPool(1);
        //set the executor thread working
        Callable<Integer> task = new Callable<Integer>() {
            public Integer call() {
               try {
                   return in.read();
               } catch (Exception e) {
                  //do nothing
               }
               return null;
            }
         };

         Future<Integer> future = executor.submit(task);
         Integer result =null;
         try {
              result= future.get(1, TimeUnit.SECONDS); //timeout of 1 sec
          } catch (TimeoutException ex) {
              //do nothing
          } catch (InterruptedException e) {
             // handle the interrupts
          } catch (ExecutionException e) {
             // handle other exceptions
          } finally {
              future.cancel(false);
              executor.shutdownNow();
           }

         if(result==null)
             return (char) -1;
        return  (char) result.intValue();
    } 
于 2012-10-31T10:51:17.653 に答える
0

読み取り用に別のスレッドを生成する必要があります。まさに直面している理由から、1 つのスレッドで「ピンポン」方式で進むことはできません。

ところで、あなたがリンクした質問には、受け入れられた回答があります。CPU を 100% の負荷にしないことをお勧めします。これは本当に良いアドバイスです :)

ただし、readメソッドはブロックされるため、ループに入れてスレッドに入れ、何かを受信したときにコールバックすることができます。ループを終了し、IOException または "-1" でスレッドを終了し、その後も幸せに暮らします :)

于 2012-10-30T10:12:15.870 に答える