JAVA socket传送文件一直被阻塞

我写了一个简单的JAVAsocket传送文件的程序如下:客户端:System.out.println("filedownloadstarts.");FilefDir=ne... 我写了一个简单的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而导致一直卡在那不动。
不知道我这两段代码有什么错误,导致了这种奇怪的阻塞,求教啊!!谢谢
但是read方法本身不就有告知客户端文件传送结束的功能么 当读到文件结束符的时候它会返回-1的啊
展开
 我来答
我今天上课了
2010-09-10 · TA获得超过1410个赞
知道小有建树答主
回答量:844
采纳率:0%
帮助的人:674万
展开全部
客户端拆裤不是进入死循环了,而是停在chunkSize = buffile.read(line),这句代码上了,客户端在等待服务器传送数据来;
就跟你服务器接受客户端一个情况:
while(true){
Socket s=ss.accept();
}
此时你的客户端收数据就是这个意思,所以你客旅橡简户端不能写!=-1
服务端往流里写数据!=-1 是正常的读文件判断,应该这样,当满足是,也就是文件读完了,他将不忘客户端发送数据了,而如升客户端一直等等,此时就是我上面说的了,也就是你说的“死循环”

所以应该按照1楼说的 ,服务器!=-1 后,你在写一个比如“结束” 到客户端,客户端while里是 如果接受“结束” 就停止
Jseven_jy
2010-09-10 · TA获得超过8122个赞
知道大有可为答主
回答量:2499
采纳率:100%
帮助的人:1128万
展开全部
是不能等于-1撒..

他在等你那边给他写东西呢..

你应该在服务器端结束的时候给谨轮橡他写个东西过去..让他知道已经结束了..

还有什么问题HI我哈

但是read方法本身不就有告知客户端文件传送结束的功能么 当读到文件结束符的时候它会返回-1的啊

确实读文件结束就是-1...
但是你的客户端读的不是文件啊..服务祥旁器才是读文件..所以服务器能正常结束..
你的客户端读的服务器发来的东西..服务器读文件结束后就不给客户端发信息了..
而客户端的read()方法是阻塞式方法..意思就是桐肆服务器不传给他数据他就会一直等..

所以还是那样..在服务器端结束的时候给客户端发个消息说明已经结束了..客户端读到这个结束标志的时候也就不要再往文件里面写东西了..也结束..这样你的程序就正确了..
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式