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的啊 展开
客户端:
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的啊 展开
2个回答
展开全部
客户端拆裤不是进入死循环了,而是停在chunkSize = buffile.read(line),这句代码上了,客户端在等待服务器传送数据来;
就跟你服务器接受客户端一个情况:
while(true){
Socket s=ss.accept();
}
此时你的客户端收数据就是这个意思,所以你客旅橡简户端不能写!=-1
服务端往流里写数据!=-1 是正常的读文件判断,应该这样,当满足是,也就是文件读完了,他将不忘客户端发送数据了,而如升客户端一直等等,此时就是我上面说的了,也就是你说的“死循环”
所以应该按照1楼说的 ,服务器!=-1 后,你在写一个比如“结束” 到客户端,客户端while里是 如果接受“结束” 就停止
就跟你服务器接受客户端一个情况:
while(true){
Socket s=ss.accept();
}
此时你的客户端收数据就是这个意思,所以你客旅橡简户端不能写!=-1
服务端往流里写数据!=-1 是正常的读文件判断,应该这样,当满足是,也就是文件读完了,他将不忘客户端发送数据了,而如升客户端一直等等,此时就是我上面说的了,也就是你说的“死循环”
所以应该按照1楼说的 ,服务器!=-1 后,你在写一个比如“结束” 到客户端,客户端while里是 如果接受“结束” 就停止
展开全部
是不能等于-1撒..
他在等你那边给他写东西呢..
你应该在服务器端结束的时候给谨轮橡他写个东西过去..让他知道已经结束了..
还有什么问题HI我哈
但是read方法本身不就有告知客户端文件传送结束的功能么 当读到文件结束符的时候它会返回-1的啊
确实读文件结束就是-1...
但是你的客户端读的不是文件啊..服务祥旁器才是读文件..所以服务器能正常结束..
你的客户端读的服务器发来的东西..服务器读文件结束后就不给客户端发信息了..
而客户端的read()方法是阻塞式方法..意思就是桐肆服务器不传给他数据他就会一直等..
所以还是那样..在服务器端结束的时候给客户端发个消息说明已经结束了..客户端读到这个结束标志的时候也就不要再往文件里面写东西了..也结束..这样你的程序就正确了..
他在等你那边给他写东西呢..
你应该在服务器端结束的时候给谨轮橡他写个东西过去..让他知道已经结束了..
还有什么问题HI我哈
但是read方法本身不就有告知客户端文件传送结束的功能么 当读到文件结束符的时候它会返回-1的啊
确实读文件结束就是-1...
但是你的客户端读的不是文件啊..服务祥旁器才是读文件..所以服务器能正常结束..
你的客户端读的服务器发来的东西..服务器读文件结束后就不给客户端发信息了..
而客户端的read()方法是阻塞式方法..意思就是桐肆服务器不传给他数据他就会一直等..
所以还是那样..在服务器端结束的时候给客户端发个消息说明已经结束了..客户端读到这个结束标志的时候也就不要再往文件里面写东西了..也结束..这样你的程序就正确了..
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询