簡體   English   中英

將文件作為塊從Java客戶端發送到服務器

[英]Sending file as chunks from a java client to server

我編寫了一個Java客戶端,該客戶端將byte數組的buffer_size作為命令行參數,並聲明了一個byte數組,將在其中讀取文件並將其作為塊發送給服務器。 客戶端將在開始讀取文件之前將buffer_size發送到Java服務器,以便服務器還可以定義一個字節數組來接收文件塊。 所以這種機制看起來像....

客戶端:

while ((count = fileReader.read(bytes)) > 0) {
    toServer.write(bytes, 0, count);
}

服務器端:

while ((count = fromClient.read(bytes)) > 0) {
   //process the received file content
}

這很適合我。 但是服務器讀取數據塊的行為以隨機的方式改變。 即,如果要由客戶端讀取的文件為3000字節,而buffer_size為8192字節(服務器的buffer_size也為8192字節),則服務器僅讀取一次即可讀取(從客戶端)整個塊()操作,有時將塊分為2部分並進行讀取(例如,兩個1500字節占用2個read()操作)。 我不明白這里到底發生了什么。 我們可以以服務器不分割客戶端發送的塊的方式實現這一點嗎?

通過在本地計算機上同時運行客戶端和服務器進行測試時,服務器使用一個write()操作和一個read()操作讀取客戶端發送的全部內容。 僅當客戶端和服務器在不同的計算機上時,才會發生行為更改。

1500可能是鏈接的MTU。 數據被拆分成具有大小的數據包進行傳輸。 實施服務器時,必須簡單地准備好將數據切成任意大小的數據包。

TCP實現的抽象是字節流,而不是一系列的write()調用。 要強制使用特定的數據包大小,您將必須使用UDP(並處理數據包丟失,因為UDP無法保證傳遞)。

要解決此問題,只需循環讀取,直到讀取了整個緩沖區或達到文件的長度。 客戶端可以簡單地在協議開始時發送文件的長度。 客戶端和服務器不需要使用相同的緩沖區大小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM