2012-03-31 97 views
2

我正在为使用apache.commons.net.telnet的思科路由器编写telnet客户端。但我有问题。这里是代码示例:思科路由器的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客户端的提示,我会很高兴听到他们!

+0

使用'tcpdump'或其他数据包嗅探器来找出原因。从这个级别的代码是不可能的。 – 2012-03-31 19:47:42

+0

你能更准确地描述问题吗?你是说你根本没有输出?或者你得到一些输出,然后挂起?或者是什么? – 2012-03-31 20:43:55

+0

我试过使用wireshark。它显示,我的路由器发送telnet数据(提示输入密码),但我的应用程序不响应此数据包。收到三重提示后(如果发生超时错误,则发送新提示),我的应用程序将打印所有3个提示,然后输入错误密码错误。我不明白它何时发生。可能是在telnet选项? – DenisM 2012-03-31 20:56:17

回答

0

我每次都能重现这个问题。

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

这解释了为什么Looking for Java Telnet emulator的readUntil()函数起作用,它只是简单地调用read()1个字节。

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

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