4

apache.commons.net.telnetを使用してCiscoルーター用のTelnetクライアントを作成しています。しかし、私は問題があります。コードサンプルは次のとおりです。

static TelnetClient telnetClient = new TelnetClient();

public static void main(String[] args) throws IOException {
    setOptionHandlers();
    telnetClient.connect("192.168.127.100");
    read();
    telnetClient.disconnect();
}

private static void setOptionHandlers() throws IOException {
    ArrayList<TelnetOptionHandler> optionHandlers = 
        new ArrayList<TelnetOptionHandler>();
    optionHandlers.add(new TerminalTypeOptionHandler("VT100", false, false, true, false));
    optionHandlers.add(new EchoOptionHandler(true, false, true, false));
    optionHandlers.add(new SuppressGAOptionHandler(true, true, true, true));
    for (TelnetOptionHandler handler : optionHandlers) {
        try {
            telnetClient.addOptionHandler(handler);
        }
        catch (InvalidTelnetOptionException e) {
            System.err.println("Error registering option handler "
                    + handler.getClass().getSimpleName());
        }
    }
}

public static void write(byte[] data) throws IOException {
    telnetClient.getOutputStream().write(data);
    telnetClient.getOutputStream().flush();
}

public static void read() throws IOException {
    System.out.println("Read");
    byte[] buff = new byte[1024];
    int read;
    if((read = telnetClient.getInputStream().read(buff)) > 0) {
        System.out.println(new String(buff, 0, read));
    }
    System.out.println("read="+read);
}

場合によっては、正しく機能し、パスワード入力のプロンプトが表示されます。しかし、それが正しく機能しない他の場合もあります-telnet入力ストリームから読み取ることによってハングします。実行条件は同じです。なぜこのような状況になるのですか?誰かがciscotelnetクライアントを書くためのヒントを持っているなら、私はそれらを聞いてうれしいです!

4

1 に答える 1

1

この問題は毎回再現できます。

この問題は、読み取りバッファ サイズを 1 バイトに変更することで回避できます。

これは、 Looking for Java Telnet emulatorの readUntil() 関数が機能する理由を説明しています。1 バイトの read() を呼び出すだけです。

とはいえ、これは org.apache.commons.net.telnet.TelnetClient のバグを示していますか?

編集: Commons Net の以前のバージョンにロールバックすると、問題は解消されました!

于 2012-05-18T14:27:04.250 に答える