サーバー/クライアント アプリケーションを 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 の子を検索します。