2011-08-01 12 views
0

私はこれをしばらく考えようとしています。Java Apache Commonsでtelnet erase line(EL)を送信するにはどうすればよいですか?

私は、サーバーにコマンドを送信して応答を読むことができる、Apache Commons Telnetクライアントをセットアップしました。私のプログラムは、基本的にはこのように動作します:私がやろうとしている

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(); 

何以前に送信された文字(「foo」という)の行全体を消去するためのtelnet ELコマンドを送信することです。 Telnetコマンドは常に先行するIACキャラクタと一緒に送信され、それも私が送信しているものです。

私は、サーバを読み込んでそれをプリントアウトするリスナの実装を行っています。

問題は、IAC-ELを送信すると、文字がコマンドとして解釈されないということです。代わりに、IAC-EL文字は前の入力に "foo ø"として後ろにエコーバックされます。

これは一度に1文字に設定された回線モードで何らかの問題がありますか?

また、サーバー側では、telnetを使用してVT100を実行しています。おそらく、VT100のエスケープシーケンスを送信して、代わりにその行を消去する方法があります。 "←[1K"とにかく私はVT100シーケンスをすぐに送ることに失敗しました。

答えて

0

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

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

+0

送信されたパケットにスニッフィングを行いました。実際にはIAC文字がエスケープされ、IAC-IAC-ELが送信されます。しかし、私がELだけを送信しようとすると、スニッファーはELをそれ自身で送信する(IACなし)ことを示します。 ELキャラクターに続くIACを1つだけ送信するにはどうすればよいですか? – Snps

+0

@ snipes83私はそれに答えませんでしたか? – EJP

+0

私はコマンドを送信するための方法は素晴らしいでしたが、私は1つを見つけることができません。 TelnetClientクラスには、 "そこにいますか"というコマンドを送るための "sendAYT()"しかありません。私はsendAYTメソッドのソースを見て、このバイト配列を出力ストリームに書き込むようです: static final byte [] _COMMAND_AYT = {(byte)TelnetCommand.IAC、(byte)TelnetCommand.AYT}; IACがエスケープされないのはなぜですか?私は特別扱いだと思います。 – Snps

関連する問題