Android在使用socket时,调用BufferedInputStream.read方法时的阻塞问题

1 篇文章 0 订阅

    这两天在搞一个实时通讯的东西,自然就使用到了socket,关于socket的介绍以及原理可参考https://www.cnblogs.com/kakawater/p/7085122.html或自行百度。

 

        在使用BufferedInputStream.read()方法读取socket传输过来的数据的时候,发现该方法会阻塞主线程,导致程序不能够往下继续运行,一直到下一次数据的到来;并没有像往常那样,当调用该方法读到文档末尾时,会返回-1,只有关闭socket时才会使主线程不会阻塞,但是这样就不满足长连接的需求了,后查阅相关资料发现当使用socket时,客户端并不能知道服务端是否将数据传输完毕(可参考https://blog.csdn.net/qq_23703157/article/details/78208096);这样的话,我们就不能再使用传统的办法来读取BufferedInputStream中的数据了。后查询相关资料发现available()方法可返回BufferedInputStream中字节长度,那么我们就可以通过记录每次读取的长度,然后每一次循环时都和总长度比较,当读取的长度大于等于BufferedInputStream中的字节长度就跳出循环即可。具体代码如下:

 

while (true) {
    BufferedInputStream bufferedInput = new BufferedInputStream(socket.getInputStream());
    byte[] buffer = new byte[4];
    if (bufferedInput.available() > 0) {
        int len = bufferedInput.available();
        String str = "";
        int now = 0;
        while (true) {
            now =bufferedInput.read(buffer)+now;
            str = str + (new String(buffer,"gbk"));
            buffer = null;
            buffer = new byte[2];
            if (now >= len) {
                break;
            }
        }
Message mm = handler.obtainMessage();
mm.obj = str;
mm.what = 0x13;
handler.sendMessage(mm);
str = "";

 

 

加入我的行列:

(嘿嘿嘿,点击这里关于我哦,分享小知识):https://www.jianshu.com/p/7d19f0df5b6b

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值