解決DataInputStream?read不等于-1,socket文件傳輸只能傳輸一個(gè)文件無(wú)法傳輸多個(gè)問(wèn)題
被一個(gè)朋友問(wèn)到一個(gè)關(guān)于sokcet文件傳輸?shù)膯?wèn)題
他發(fā)現(xiàn)他寫(xiě)的代碼只能發(fā)送一次文件,沒(méi)辦法發(fā)送第二次,或者說(shuō)發(fā)送第二次的時(shí)候服務(wù)端就接收不到了。
部分代碼
// 開(kāi)始接收文件
byte[] bytes = new byte[1024];
//byte[] bytes = new byte[dis.available()];
int length = 0;
while((length = dis.read(bytes, 0, bytes.length)) != -1) {
System.out.println(bytes.length);
fos.write(bytes, 0, length);
fos.flush();
}
System.out.println("======== 文件接收成功 [File Name:" + fileName + "] [Size:" + getFormatFileSize(fileLength) + "] ========");我給他調(diào)試的時(shí)候發(fā)現(xiàn)確確實(shí)實(shí)發(fā)送第一次文件后就就一直阻塞在while循環(huán)里了,出不來(lái)。
本來(lái)傳輸完第一次的文件后應(yīng)該有打印“======== 文件接收成功 [File。。。。。。”
這些信息,但是實(shí)際上沒(méi)有,而且也不報(bào)錯(cuò)。
調(diào)試的時(shí)候打斷點(diǎn)也是走著走著斷點(diǎn)就不見(jiàn)了,要說(shuō)他是阻塞也不像是阻塞,因?yàn)槿绻亲枞脑捚鸫a斷點(diǎn)是會(huì)存在的只是無(wú)法往下運(yùn)行了而已,但是他這個(gè)調(diào)試就是直接斷點(diǎn)就消失了,我也懵了。
后來(lái)查資料才發(fā)現(xiàn)原來(lái)只要客戶端的DataOutputStream不close掉,那么服務(wù)端的DataInputStream read就永遠(yuǎn)不等于-1。
即使文件的數(shù)據(jù)已經(jīng)傳完了,DataInputStream依舊會(huì)等著客戶端DataOutputStream再傳數(shù)據(jù)過(guò)來(lái)。
最后只能通過(guò)判斷文件的的大小來(lái)確認(rèn)文件是否已經(jīng)傳輸完成。
解決代碼代碼
//dis就是DataInputStream
String fileName = dis.readUTF();//文件名字
long fileLength = dis.readLong();//文件長(zhǎng)度
File directory = new File(savepath);
if(!directory.exists()) {
directory.mkdir();
}
File file = new File(directory.getAbsolutePath() + File.separatorChar + fileName);
fos = new FileOutputStream(file);
// 開(kāi)始接收文件
byte[] bytes = new byte[1024];
//byte[] bytes = new byte[dis.available()];
int length = 0;
while((length = dis.read(bytes, 0, bytes.length)) != -1) {
System.out.println(bytes.length);
//fos就是FileOutputStream
fos.write(bytes, 0, length);
fos.flush();
//*************關(guān)鍵的一步**************//
if(fileLength == file.length()) break;
//***************************//
}
System.out.println("======== 文件接收成功 [File Name:" + fileName + "] [Size:" + getFormatFileSize(fileLength) + "] ========");總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
完美解決Get和Post請(qǐng)求中文亂碼的問(wèn)題
下面小編就為大家?guī)?lái)一篇完美解決Get和Post請(qǐng)求中文亂碼的問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-05-05
JavaWeb實(shí)戰(zhàn)之開(kāi)發(fā)網(wǎng)上購(gòu)物系統(tǒng)(超詳細(xì))
這篇文章主要介紹了JavaWeb實(shí)戰(zhàn)之開(kāi)發(fā)網(wǎng)上購(gòu)物系統(tǒng)(超詳細(xì)),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有很好的幫助,需要的朋友可以參考下2021-04-04
SpringBoot注解@MapperScan的實(shí)現(xiàn)
@MapperScan是MyBatis和MyBatis-Plus提供的SpringBoot注解,用于自動(dòng)掃描并注冊(cè)?Mapper?接口,使其能夠被?Spring?容器管理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-05-05
Java獲取漢字拼音的全拼和首拼實(shí)現(xiàn)代碼分享
這篇文章主要介紹了Java獲取漢字拼音的全拼和首拼實(shí)現(xiàn)代碼分享,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-06-06
使用@DS輕松解決動(dòng)態(tài)數(shù)據(jù)源的問(wèn)題
這篇文章主要介紹了使用@DS輕松解決動(dòng)態(tài)數(shù)據(jù)源的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05

