2012-08-12 31 views
1

我使用org.apache.commons.net.telnet.TelnetClient打破無限循環通過讀「登錄:」等待控制檯輸入java的

,我提供的登錄信息在Java中的遠程登錄代碼telnet服務器通過下面的代碼,

in = telnet.getInputStream(); 
    char lastChar = pattern.charAt(pattern.length()-1); 
    StringBuffer sb = new StringBuffer(); 

    char ch = (char) in.read(); 
    while (true) { 
     System.out.print(ch); 
     sb.append(ch); 
     if (ch == lastChar) { 
     if (sb.toString().endsWith(pattern)) { 
      return sb.toString(); 
     } 
     } 
     ch = (char) in.read(); 
     i++; 
     // System.out.print(i); 
    } 

但是,當我給它提示例如:「用戶名:」一個無效telnet服務器,它導致無限循環等待「登錄:」在「in.read();」

作爲它在in.read()中的等待,我不能在while(_flag)中使用任何標誌或其他標誌。 任何人都可以爲我提供避免無限循環的解決方案,當它的應用程序收到無效登錄。

+1

請正確格式化您的代碼。 – 2012-08-12 15:16:31

+0

請不要在使用StringBuilder時使用StringBuffer。 – 2012-08-13 08:03:35

回答

1
  1. 創建一個單獨的線程,它會在您想要的時間後退出。

  2. 您將需要使用boolean變量作爲標誌,while循環和break來控制此單獨的線程。

  3. 將此標誌設置爲true的方法會在您與telnet的連接成功時返回,並且這將成爲該單獨線程中的循環。

  4. 如果在規定的時間內沒有發生這種情況,那麼單獨的線程將執行System.exit(0),所以程序結束。

1

你有一個成功的標準(Telnet服務器發送login:),但不是一個失敗的標準。所以循環可能會永遠運行。

什麼應該發生在故障時打破循環?考慮一個條件。也許:「嘗試20秒」或「login:尚未在前100個字符內發送」。

您可以通過線藏漢讀取線,並期望服務器發送(在一定的時間間隔內)的第一行等於login:,否則錯誤消息出口(這就是我想你的情況做)