axings 2010-09-10 11:37
浏览 224
已采纳

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条回答 默认 最新

  • iteye_11475 2010-09-10 12:41
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?