0

私はしばらくの間これを理解しようとしてきました:

サーバーにコマンドを送信して応答を読み取ることができる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シーケンスを送信できませんでした。

4

1 に答える 1

0

実際に送信されたものを盗聴しましたか?ApacheコードがIACをエスケープすることを期待しているので、実際にはIAC-IAC-ELを送信しています。

TelnetClient.sendCommand(EL)を呼び出す必要があります。

于 2011-08-02T03:20:41.563 に答える