[英]Measuring actual bytes written through Java sockets
我編寫了一個小程序,用於從一個客戶端向另一個客戶端發送/接收文件。 我為接收器和客戶端設置了進度條,但問題是發送方似乎比實際傳輸更快地完成了進度條。 問題在於它如何計算已寫入的字節數。 我假設它正在計算我讀入緩沖區的字節數,而不是通過網絡發送的字節數,那么我該如何找到解決這個問題的方法呢? 接收器正在以正確的速率計算他接收的字節,但發送者沒有正確地做他的部分。
設置較低的緩沖區大小會稍微抵消差異,但仍然不正確。 我嘗試用CountingOutputStream包裝outputstream,但它返回與下面的代碼片段相同的結果。 傳輸最終正確完成,但我需要正確的“已發送”值來更新我的進度條,就像在接收器端實際接收並寫入光盤一樣。 我已經包含了一個非常簡化的代碼片段,它代表了我計算傳輸字節的方法。 任何解決方案的例子都會非常有用。
try
{
int sent = 0;
Socket sk = new Socket(ip, port);
OutputStream output = sk.getOutputStream();
FileInputStream file = new FileInputStream(filepath);
byte[] buffer = new byte[8092];
while ((bytesRead = file.read(buffer)) > 0)
{
output.write(buffer, 0, bytesRead);
sent += bytesRead;
System.out.println(sent); // Shows incorrect values for the actual speed.
}
}
簡而言之,考慮到你和“線”本身之間的緩沖區數量,我認為你不能僅僅從“發送者”那里得到你正在尋找的那種准確的可見性。 但是,我認為不重要。 原因如下:
當字節被傳遞到網絡堆棧時,字節計為“已發送”。 當您發送少量字節(例如您的8K示例)時,這些字節將被緩沖並且write()調用將快速返回。
一旦達到網絡飽和狀態,當各種網絡緩沖區變滿時,write()調用將開始阻塞 - 這樣您就可以真正了解時間。
如果你真的必須有某種“你收到了多少字節?” 您必須讓接收端通過帶外機制(例如由glowcoder建議)定期發回該數據
從套接字獲取輸入流,另一方面,當您將選擇的字節寫入磁盤時,將結果寫入輸出流。 產生第二個線程來處理這些信息的讀取,並將其鏈接到您的計數器。
您的變量已sent
- 這是准確的。 您需要的是received
或processed
變量,為此您需要雙向通信。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.