這裡簡單的讨論一下java設計網絡程式中如何控制上傳和下載下傳速度,我們常見的FTP,HTTP,BT等協定都是TCP的,但是現在流行的utorrent卻基于UDP實作了自己UTP協定(UDP+擁塞控制),不管使用什麼協定,站在I/O的角度來說,限速的控制思路都是一樣的。
思路很簡單,如下:
1.假設下載下傳或者上傳速度上限是m (KB/s),那麼發送一個固定的位元組資料(假設是n位元組)的時間花費是:n/m;
2.假設現在要發送n位元組的資料,那麼理論所需的時間應該是n/m,而在實際情況下,發送n位元組的資料隻花費了t秒,那麼發送該發送線程就應該睡眠n/m-t秒,這樣就基本實作了速度的控制。
代碼以TCP為例
速度控制
下載下傳控制
同樣,上傳控制
對于一個TCP socket
在多線程環境下也可以使用上述的方法。最後附圖是任務管理器的網絡使用率圖6250KB/s(也就是50000kb/s,附圖中網絡使用率也在5%左右,是以應該這個做法還算準确)
