使用ByteBuffer包装byte数组,简化加入数据操作。前面4个字节指示待接收图片大小,紧跟着是截屏图片数据。原先的实现比较粗糙,下面是我改写之后的代码,逻辑上还是比较严密的。
- InOutStructure inOutStructure = InOutStructure
- .getInOutStructure(serialNumber);
- int length = 0;
- byte[] captureBuffer = cc.getCaptureBuffer();
- ByteBuffer bb = ByteBuffer.wrap(captureBuffer);
- try {
- inOutStructure.GetOut().println(cmd);
- // flush会添加回车换行符
- inOutStructure.GetOut().flush();
- byte[] buffer = new byte[1024];
- // 此处可能抛:java.net.SocketException
- int dataLen = inOutStructure.getIn().readInt();
- int remainder = dataLen;
- while(true) {
- // 准备接收的长度
- int expect_recv_len = (remainder > 1024) ? 1024 : remainder;
- int read = inOutStructure.getIn().read(buffer, 0, expect_recv_len);
- length += read;
- // 此处read可能为-1
- bb.put(buffer, 0, read);
- remainder = dataLen - length;
- // 如果剩余接收长度为0,说明已经接收完全
- if (remainder == 0) {
- break;
- }
- }
- // 将截屏结果缓存起来
- TaskResult.cacheCaptureBuffer(serialNumber, captureBuffer, length);
- } catch (IOException e) {
- e.printStackTrace();
- }
转载于:https://blog.51cto.com/memory/1038135