1、建立socket长连接以后,进行数据读取,代码如下
Socket socket = socketmap.get(handler);
try {
BufferedInputStream br = new BufferedInputStream(socket.getInputStream());
ByteArrayBuffer babuf = new ByteArrayBuffer(4096);
byte[] data = new byte[4096];
int size = 0;
Log.d(TAG," size "+size+", len : "+len+" , br name : "+br.getClass().getName());
while (size < len) {
if((len - size) <= 4096)
{
data = new byte[len - size];
}
Log.d(TAG,"data length : "+data.length);
int length = br.read(data);
Log.d(TAG," read length : "+length);
if(length == -1)
{
break;
}
size = size + length;
babuf.append(data, 0, length);
Log.d(TAG,"read time size : "+size);
}
Log.d(TAG,"break while : "+size+", length : "+len);
//byte[] res = baout.toByteArray();
byte[] res = babuf.toByteArray();
Message msg = new Message();
msg.length = size;
msg.content = res;
Log.d(TAG,"read by handler : "+handler+",size : "+size+" byte res length : "+res.length);
return msg;
} catch (Exception e) {
Log.e(TAG, e.getMessage(), e);
}
finally
{
}
现在server端详socket中写入50个byte,第一次调用次方法读取12byte,但是第二次计划再读取剩下的byte的时候就在 int length = br.read(data); 这个地方阻塞,在网上找了很多资料都没有人解决,最后只能自己摸索
read阻塞的原因是第二次没有读到数据,很有可能是第一次把数据读完了,分析发现BufferedInputStream的问题,这个流自己有缓存,第一次就把数据读取完了
解决方法就是不要使用 BufferedInputStream 就好了