各位前辈大家好,小弟在此请教大家有关Android SocketChannel
使用上的一些问题,以下是程式需求以及遇到的瓶颈:
1. 在一远端系统上撰写了服务器控制照相机,固定输出QQVGA尺寸
、JPEG格式的图档,只要有客户端程式发送需求,就撷取一张图
片回传给客户端,之后关闭连线,由于考虑到JPEG最复杂的档案
,所以服务器端截取的图档最大尺寸为20K bytes,后续JPEG图
档的头尾交由客户端处理搜寻。
2. 目前在Android系统开发客户端程式,版本为4.X,小弟先使用按
钮控制远端截取一张图片做测试,平均送收一张花费的时间大约
140~170ms;之后手动连续点按钮验证是否可以连续收发,至此
动作也都很正常,SocketChannel反应时间也大约在150~170ms。
以下为SocketChannel实做的部分程式码:
socketChannel = SocketChannel.open();
socketChannel.configureBlocking(true);
socketChannel.connect(new InetSocketAddress("192.168.1.20",
TCP_SERVER_PORT));
ByteBuffer buf = ByteBuffer.allocate(1024);
buf.put((byte)outPut_cmd);
buf.flip();
if(outPut_cmd==49){
bytesRead = 0;
socketChannel.write(buf);
inPut_buf.limit(20480);
while(bytesRead<20480){
bytesRead = bytesRead + socketChannel.read(inPut_buf);
}
/* record tcp receive spend time */
ProcessTime = System.currentTimeMillis() - StartTime;
Log.i("TcpClient", "Process time = " + ProcessTime + "ms");
// inPut_buf.flip();
// location = BytesIndexOf(inPut_buf.array(), jpegStart, 0);
// Log.i("TcpClient", "jpegStart location = " + location.intValue());
// Log.i("TcpClient", "start location = " + location.intValue());
inPut_buf.flip();
location = BytesIndexOf(inPut_buf.array(), jpegEnd, 0);
fileSize = location+2;
inPut_buf.flip();
fileName = "hm5065_"+String.format("%04d", fileCounter)+".jpg";
/* record jpeg size and use ram buffer index number */
countBundle = new Bundle();
countBundle.putString("file_name", fileName);
countBundle.putInt("jpeg_size", fileSize);
countBundle.putString("save_type", save_file_hanlder);
/* store bundle to message */
message = new Message();
message.setData(countBundle);
handler.sendMessage(message);
/* clear inPut_buffer */
inPut_buf.clear();
inPut_buf.flip();
fileSize = 0;
fileCounter++;
3. 实做Service,在背景执行客户端撷取图片的服务,起动service以后
只有第一次的收送时间是150ms,第二次之后的收发时间平均都在三
秒左右,尔后都没有再回到150ms的水准。
在这里想请教前辈们几个问题:
a. Android的网络客户端在使用sevice实做时,连续发送client request
造成reqponse反应时间变长是什么原因造成的?但使用按钮发送客户端的
请求没有反应时间过长的情况,按钮间隔大约都到一秒。
b. 小弟在Service thread中也加入了thead.sleep去间隔,确认不是client
request太过频繁所造成,当sleep时间加到500ms左右,反应时间减少
到约2秒左右。
最后小弟附上原始码连结,恳请版上各位前辈不吝赐教,谢谢。
原始码下载点:http://ppt.cc/SPhy