通過Socket連線一次傳輸多個檔案

2021-06-23 07:10:10 字數 2256 閱讀 6876

最近在做乙個通過wifi在手機之間傳輸檔案的功能。需要在手機之間建立乙個持久的socket

連線並利用該連線傳輸資料。可以一次傳輸乙個或多個檔案。

在一次傳輸多個檔案時,遇到了乙個困難:如何在接收檔案時確定檔案之間的邊界。

為了在接收端正確的拆分檔案,在傳輸檔案時需要傳輸每個檔案的大小。

我採用了這樣一種策略:首先傳送每個檔案的名稱和大小,然後傳輸檔案的內容。

protected void sendfile(socket socket, file files) 

dataoutputstream dout = new dataoutputstream(

socket.getoutputstream());

dout.writeint(files.length);

for (int i = 0; i < files.length; i++)

dout.writelong(totalsize);

for (int i = 0; i < files.length; i++)

}system.out.println("檔案傳輸完成");

} catch (exception e)

return;

}

接收檔案時有些複雜。每次從輸入流中讀入快取中的資料有可能包含多個檔案的內容,

需要利用每個檔案的大小資訊把快取中的資料放入不同的檔案。

protected void receivefile(socket socket) 

datainputstream din = null;

int filenum = 0;

long totalsize = 0;

fileinfo fileinfos = null;

try

totalsize = din.readlong();

} catch (ioexception e)

system.out.println(filenum);

system.out.println(totalsize);

for (fileinfo fileinfo : fileinfos)

// // /

int leftlen = 0; // 寫滿檔案後快取區中剩餘的位元組長度。

int bufferedlen = 0; // 當前緩衝區中的位元組數

int writelen = 0; // 每次向檔案中寫入的位元組數

long writelens = 0; // 當前已經向單個檔案中寫入的位元組總數

long totalwritelens = 0; // 寫入的所有位元組數

byte buf = new byte[8192];

for (int i = 0; i < filenum; i++) else

if (bufferedlen == -1)

return;

system.out.println("readlen" + bufferedlen);

// 如果已寫入檔案的位元組數加上快取區中的位元組數已大於檔案的大小,只寫入快取區的部分內容。

if (writelens + bufferedlen >= fileinfos[i].mfilesize) else

leftlen = 0;

}//(int) (totalwritelens * 100 / totalsize));

} // end while

fout.close();

} catch (exception e)

} // end for

null);

}

注:在傳輸檔案時還傳輸了檔案的總大小,這樣為了在接收檔案時判定接收是否結束。

還有一種傳輸方法比較複雜但更加靈活傳送檔案時依次傳輸每個檔案的名稱,大小和內容。

相比上乙個方法這種傳送方式接受時更難處理。

因為每次從輸入流中讀入快取的資料可能包含了上乙個檔案的內容,下乙個檔案的名稱和大小。

由於資料已被讀入了快取,

這就不能利用datainputstream的方法讀取utf字串和int,

必須從快取中解析。

介紹兩種解析方法

利用bytearrayinputstream 把快取中的內容轉化為記憶體流然後利用datainputstream讀取。

手動解析,利用位運算拼接出int。

注:int 的長度為4是確定的。writeutf 寫入的字串長度儲存在開始的兩個位元組中。

App Store如何申請一次通過?

在申請之前,我們已經做好了起碼被拒絕4次以上,打長期持久戰的準備。我們在上個周一遞交了v1.0 版本的申請,然後忐忑等了10天之後,今天收到通知,一次性通過審核,已經上線。在說我們為此提前做了哪些準備之前,我們先說說之前在其他專案裡碰到過的鬧心的拒絕理由,這樣你就明白,為什麼我們這次居然還要寫乙個總...

App Store如何申請一次通過?

2019獨角獸企業重金招聘python工程師標準 在申請之前,我們已經做好了起碼被拒絕4次以上,打長期持久戰的準備。我們在上個周一遞交了v1.0 版本的申請,然後忐忑等了10天之後,今天收到通知,一次性通過審核,已經上線。在說我們為此提前做了哪些準備之前,我們先說說之前在其他專案裡碰到過的鬧心的拒絕...

網路程式設計 socket第複習一次

伺服器端 一次會話 import socket 建立socket物件 soc socket.socket 繫結ip和埠號 soc.bind 6666 開始監聽 soc.listen while true print 等待連線 等待連線 conn,add soc.accept print 連線成功 w...