1

サーバー/クライアント アプリケーションを Java で作成しました。ここで、サーバーと対話的に対話するためのテスト コンポーネントを作成する必要があります。テスト コンポーネント自体は、クライアント インスタンスを処理するクラス (それぞれの ProcessBuilder) で構成されます。

問題は次のとおりです。サーバーの応答を解析する (応答の末尾を見つける) ために、エスケープ シーケンス (\t\b など) 内の特定の行を閉じます。これは期待どおりに機能しますが、特定のコマンドをサーバーに送信する前に、InputStream をクリアする必要があります (ログ エントリ、ステータス メッセージなど、ストリーム内のすべてのものを破棄します)。

//input=process.getInputStream();
//out = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));

public String send(String command){
    log.info("execute: " + command);

    try{
        //clear old output
        int chars = input.available();

        log.info("Skip " + chars + " characters from process output.");
        input.skip(chars);

        out.write(command + "\n");
        out.flush();

    }catch (IOException e){
        log.error("could not write to process", e);
    }

    BufferedReader reader = new BufferedReader(new InputStreamReader(input));
    StringBuilder str = new StringBuilder();

    String line;

    try {
        while( (line = reader.readLine()) != null ){
            log.info("new line " + line);

            if(line.contains("\t\b")){
                //skip others
                input.skip(input.available());
                break;
            }
        }
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

    return str.toString();
}

しかし、これはうまくいきません。

出力例

0    [main] INFO  loadtesting.ClientHandler  - ClientHandler started 1543748404 (localhost 9000 )
6    [main] INFO  loadtesting.ClientHandler  - execute: somecommand
 6    [main] INFO  loadtesting.ClientHandler  - Skip 0 characters from process output.
 112  [main] INFO  loadtesting.ClientHandler  - new line Connection successfully
 113  [main] INFO  loadtesting.ClientHandler  - new line no entries available\t\b

「接続成功」は破棄する必要があります。

113  [main] INFO  loadtesting.ClientHandler  - execute: somecommand
 113  [main] INFO  loadtesting.ClientHandler  - Skip 0 characters from process output.
 114  [main] INFO  loadtesting.ClientHandler  - new line no entries available\t\b

114  [main] INFO  Test  - Test: close
 114  [main] INFO  loadtesting.ClientHandler  - ClientHandler Closed 1543748404
 114  [main] INFO  loadtesting.ClientHandler  - und ciao

更新 問題は見つかりましたが、解決策はありません。これは、InputStream の available メソッドが常に 0 を返すためです。

クラス InputStream の available メソッドは、常に 0 を返します。

次に、available() を実装する IS の子を検索します。

4

0 に答える 0