2012-03-31 119 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,問題消失了!