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

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;

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

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器