私はしばらくの間これを理解しようとしてきました:
サーバーにコマンドを送信して応答を読み取ることができるApacheCommonsTelnetクライアントをセットアップしました。私のプログラムは基本的に次のように機能します。
TelnetClient telnetClient = new TelnetClient();
// Add option handlers
TerminalTypeOptionHandler ttopt = new TerminalTypeOptionHandler(
"VT100", false, false, true, false);
EchoOptionHandler echoopt = new EchoOptionHandler(true, false, true,
false);
SuppressGAOptionHandler gaopt = new SuppressGAOptionHandler(true, true,
true, true);
try {
telnetClient.addOptionHandler(ttopt);
telnetClient.addOptionHandler(echoopt);
telnetClient.addOptionHandler(gaopt);
} catch (InvalidTelnetOptionException e) {
System.err.println("Error registering option handlers: "
+ e.getMessage());
throw new IOException();
}
// Connect to server
telnetClient.connect(SERVER_ADDRESS, SERVER_PORT);
byte[] data = new byte[] { 'f', 'o', 'o', '\r', '\n' };
// Send "foo"
telnetClient.getOutputStream().write(data);
telnetClient.getOutputStream().flush();
// ...
// Erase previous input
data = new byte[] { (byte) TelnetCommand.IAC, (byte) TelnetCommand.EL,
'\r', '\n' };
telnetClient.getOutputStream().write(data);
telnetClient.getOutputStream().flush();
私がやろうとしているのは、telnet ELコマンドを送信して、以前に送信された文字( "foo")の行全体を消去することです。Telnetコマンドは常に前にIAC文字を付けて送信され、それも私が送信しているものです。
サーバーのエコーを読み取り、それらを出力するリスナーの実装が機能しています。
問題は、IAC-ELを送信すると、文字がコマンドとして解釈されないことです。代わりに、IAC-EL文字はエコーバックされ、前の入力に「foo�ø」として追加されます。
これは、ラインモードが一度に1文字に設定されている場合の問題でしょうか?
また、サーバー側はtelnetを介してVT100を実行しています。VT100エスケープシーケンスを送信して、代わりに行を消去する方法があるかもしれません。たとえば、「←[1K」」です。とにかく、これまでVT100シーケンスを送信できませんでした。