2013-07-08 26 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

不同意。如果长度不匹配,则包含快速返回。你的建议仍然不错。 –