JAVA socket 传送文件一直被阻塞

我写了一个简单的JAVA socket传送文件的程序如下:

客户端:
System.out.println("file download starts.");
File fDir = new File("./downloads");
File file = new File(fDir, "abc.txt");
BufferedOutputStream bufr = new BufferedOutputStream(new FileOutputStream(file));
byte[] line = new byte[102400];
int chunkSize;
while((chunkSize = in.read(line))!= -1){
bufr.write(line, 0, chunkSize);
bufr.flush();
Thread.sleep(10);
}
bufr.close();
System.out.println("file download completes");

服务器端:
File file = new File(fDir, fileName);
BufferedInputStream buffile = new BufferedInputStream(new FileInputStream(file));
byte[] line = new byte[102400];
int chunkSize;
System.out.println("file transmission start.");
while ((chunkSize = buffile.read(line)) != -1) {
out.write(line, 0, chunkSize);
Thread.sleep(10);
}
buffile.close();
System.out.println("file transmission complete.");

结果服务器端可以正常打印出"file transmission complete.",但是客户端程序总会进入死循环。
看起来好像是因为read是阻塞方法,但是始终接收不到服务器端发来的文件结束符
于是就卡在了chunkSize = in.read(line))!= -1这条语句一样。
而当我把程序强行结束掉,客户端下载的文件就立即出现在硬盘里了,而且无任何损坏。看起来客户端已经成功的接受了文件的所有部件,就是因为阻塞方法read不能返回-1而导致一直卡在那不动。
不知道我这两段代码有什么错误,导致了这种奇怪的阻塞,求教啊!!谢谢

1个回答

需要使用文件大小来结束while循环,首先Server发送文件大小给Client,Client在循环中判断接受到的数据长度的累加值是否等于文件长度,如果想等,则break;

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐