簡體   English   中英

測量通過Java套接字寫入的實際字節數

[英]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.
        }
    }

簡而言之,考慮到你和“線”本身之間的緩沖區數量,我認為你不能僅僅從“發送者”那里得到你正在尋找的那種准確的可見性。 但是,我認為不重要。 原因如下:

  1. 當字節被傳遞到網絡堆棧時,字節計為“已發送”。 當您發送少量字節(例如您的8K示例)時,這些字節將被緩沖並且write()調用將快速返回。

  2. 一旦達到網絡飽和狀態,當各種網絡緩沖區變滿時,write()調用將開始阻塞 - 這樣您就可以真正了解時間。

  3. 如果你真的必須有某種“你收到了多少字節?” 您必須讓接收端通過帶外機制(例如由glowcoder建議)定期發回該數據

從套接字獲取輸入流,另一方面,當您將選擇的字節寫入磁盤時,將結果寫入輸出流。 產生第二個線程來處理這些信息的讀取,並將其鏈接到您的計數器。

您的變量已sent - 這是准確的。 您需要的是receivedprocessed變量,為此您需要雙向通信。

暫無
暫無

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

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