読者です 読者をやめる 読者になる 読者になる

TelnetClientって難しい?

Telnet接続をするためのラーニングコードを書いた。

でも下記の問題がどうにもならないし、どこから手をつけていいかさっぱりわからない

。- lsなどを実行すると各要素の前後に変な文字列が表示される。これってカラーコード?例を示したかったんですが、エントリ全体が文字化けするのでやめました。

  • ログアウトしてもDisconnectされない
  • viなどスクリーン編集したくても、うまくスクロールを制御できない。

TeraTermのコードを覗いてみたが、さっぱりわからない。どうしたらいいのか途方にくれた。標準入力から標準出力へ流すだけのコードをさらしておこう・・・。何かに使うかもしれないし。たぶんRFCを読んで何とかするしかないんだろうな・・・。

インデントが見づらい件はごめんなさい。はてなスーパーPRE記法で色づけしてますが、タブ幅の指定も分かりません。そのうち何とかしよう。

[2007-10-31 追記]
タブ幅が見づらい件は、HTML+CSSではなんともならないことが分かったので、半角4スペースに置換してから上げることに。

package leaning;

import java.io.InputStream;
import java.io.OutputStream;

import org.apache.commons.net.telnet.TelnetClient;
import org.apache.commons.net.telnet.TelnetCommand;

public class TelnetClientLeaning {

    public static void main(String[] args) throws Exception {
        final TelnetClient client = new TelnetClient();
        Thread connectThread = new Thread(){
            @Override
            public void run() {
                InputStream inStream = client.getInputStream();
                byte[] buff = new byte[256];
                while(true){
                    try{
                        int numRead = inStream.read(buff);
                        if(TelnetCommand.isValidCommand(buff[0])){
                            System.out.println(TelnetCommand.getCommand(buff[0]));                            
                        }
                        if(numRead > 0){
                            System.out.print(new String(buff,0,numRead,"utf-8"));
                        }
                    }catch(Exception e){
                        e.printStackTrace();
                    }
                }
            }
        };
        Thread commandThread = new Thread(){
            @Override
            public void run() {
                OutputStream commandStream = client.getOutputStream();
                while(commandStream == null){
                    commandStream = client.getOutputStream();
                }
                byte[] buff = new byte[256];
                while(client.isConnected()){
                    try{
                        int numRead = System.in.read(buff);
                        if(numRead > 0){
                            commandStream.write(buff,0,numRead);
                            commandStream.flush();
                        }
                    }catch(Exception e){
                        e.printStackTrace();
                    }
                }
            }
        };
        client.connect("localhost", 8023);
        connectThread.start();
        commandThread.start();
    }
}