用于cisco路由器的Telnet客户端

时间:2012-03-31 19:45:52

标签: client apache-commons telnet cisco

我正在使用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输入流读取挂起。运行条件是一样的。为什么我会遇到这种情况? 如果有人有写cisco telnet客户端的技巧,我会很高兴听到他们!

1 个答案:

答案 0 :(得分:0)

我每次都可以重现这个问题。

通过将读取缓冲区大小更改为1个字节可以解决该问题。

这说明了来自Looking for Java Telnet emulator的readUntil()函数工作的原因,它只是调用read()1个字节。

那就是说,这是否表示org.apache.commons.net.telnet.TelnetClient中存在错误?

编辑:回到早期版本的Commons Net,问题就消失了!