这两天做作业遇到了一个难点:Socket通信时读取信息时的阻塞问题,也许大家也会遇到,在这里我做个分享
---------------------------
在输入流socket.getInputStream中,如果某线程调用read()方法,则会形成阻塞,等读取到消息以后才会继续执行。
而我们在读取的时候经常采用while循环,循环条件是while (int res = bis.read()) != -1,即发送信息方write到数据的末尾时,会返回一个-1,然后接收方read到-1后,循环终止。可不幸运的是,java中很少能返回-1,导致read() 经常阻塞(C语言中比较容易返回-1)。
-------------------------------
解决方法:
***********
方法1. 在发送方write完数据以后,再write一个换行符'\n',然后再接收方判断,如果read到的数据是'\n',则跳出循环
while((res = bis.read()) != -1) {
System.out.println("-----------------我刚进入读取循环, " + "res = " + res);
bos.write(res);
if(res == '\n') {
break;
}
}
**********
方法2. 读取时可以规定一个缓冲的byte[length]数组,在刚开始没有进入循环时,先读取一个byte数组的数据,然后进入死循环while(true) {},判断接下来读取到的数据长度,若>= length,则表示数据还没有读完,继续读取;否则,退出循环
byte[] bArr = new byte[1024];
System.out.println("开始接受文件");
// bis:从客户端中读取; bos:写到本地中
int res = bis.read();
while (true) {
bos.write(res);
if (res >= 1024) {
res = bis.read();
} else {
break;
}
}
Socket通信时读取信息的阻塞问题(TCP的粘包问题)
最新推荐文章于 2023-04-22 15:25:21 发布