这两天在搞一个实时通讯的东西,自然就使用到了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