使用ByteBuffer包装byte数组,简化加入数据操作。前面4个字节指示待接收图片大小,紧跟着是截屏图片数据。原先的实现比较粗糙,下面是我改写之后的代码,逻辑上还是比较严密的。

 
  
  1. InOutStructure inOutStructure = InOutStructure 
  2.                 .getInOutStructure(serialNumber); 
  3.  
  4.         int length = 0
  5.         byte[] captureBuffer = cc.getCaptureBuffer(); 
  6.          
  7.         ByteBuffer bb = ByteBuffer.wrap(captureBuffer); 
  8.          
  9.         try { 
  10.             inOutStructure.GetOut().println(cmd); 
  11.             // flush会添加回车换行符 
  12.             inOutStructure.GetOut().flush(); 
  13.              
  14.             byte[] buffer = new byte[1024]; 
  15.              
  16.             // 此处可能抛:java.net.SocketException 
  17.             int dataLen = inOutStructure.getIn().readInt(); 
  18.             int remainder = dataLen; 
  19.              
  20.             while(true) { 
  21.                 // 准备接收的长度 
  22.                 int expect_recv_len = (remainder > 1024) ? 1024 : remainder; 
  23.                 int read = inOutStructure.getIn().read(buffer, 0, expect_recv_len); 
  24.                 length += read; 
  25.                  
  26.                 // 此处read可能为-1 
  27.                 bb.put(buffer, 0, read); 
  28.                  
  29.                 remainder = dataLen - length; 
  30.                 // 如果剩余接收长度为0,说明已经接收完全 
  31.                 if (remainder == 0) { 
  32.                     break
  33.                 } 
  34.             } 
  35.             
  36.             // 将截屏结果缓存起来 
  37.             TaskResult.cacheCaptureBuffer(serialNumber, captureBuffer, length); 
  38.         } catch (IOException e) { 
  39.             e.printStackTrace(); 
  40.         }