java socket 长连接 nputStream的read 阻塞问题情况之一

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 就好了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值