2013-07-08 30 views
1

我寫了一個「期望」類型的實現向路由器發送命令。增強telnet連接讀取輸入速度

我正在觀察的是,來自連接的輸入處理要慢得多。

我的代碼如下,

public static String expect(String expectString) { 
     try { 
      int c = 0; 
      while ((c = br.read()) != -1) { 
       expectBuffer.append((char) c); 
       System.out.print((char) c); 
       if (expectBuffer.toString().contains(expectString)) { 
        break; 
       } 
      } 
      String expBuff = expectBuffer.toString(); 
      expectBuffer.setLength(0); 
//   System.out.println(expBuff); 
      return expBuff; 
     } catch (Exception e) { 
      return ""; 
     } 

    } 

    public static void send(String cmd) { 
     pw.print(cmd + "\r"); 
     pw.flush(); 
    } 

main,我稱他們爲像下面,

  socket = new Socket(); 
      socket.connect(new InetSocketAddress(server, 23), 10000);//Will wait for 10 seconds 
      socket.setKeepAlive(true); 
      socket.setSoTimeout(10000); 
      expectBuffer = new StringBuilder(); 
      br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      pw = new PrintWriter(socket.getOutputStream(), true); 
      expect("Login"); 
      send("dinesh"); 
      expect("Password"); 
      send("stack"); 
      expect(server + "#"); 
      send("some command here"); 
      expect(server + "#"); 

它需要很長時間來處理輸入和打印相同的安慰。

任何人都可以提供改進我的代碼的建議嗎?

在此先感謝。

+0

當你使用一個不同的Telnet客戶端更快速地做路由器響應比你在代碼中看到包到達?除此之外,快速瀏覽一下,不要從緩衝區進行單字節讀取,通過讀取(byte [],offset,length)執行批量讀取 –

+0

也對於sendIing,請確保啓用tcpnodelay。無關的建議。 –

回答

2

使用InputStream的int read(byte [] b)函數,而不是int read()。

這將加快閱讀了很多,由於信息在更大的是1

+0

我同意,但我不確定它會改善多少東西。如果我們有一個想法,在這種情況下「慢」和「快」是好的。 –

+0

我的猜測是,它是.contains函數調用,它針對佔用大部分時間的每個字節運行,通過在塊中添加可大大減少的字節。 –

+0

不同意。如果長度不匹配,則包含快速返回。你的建議仍然不錯。 –