Java程序如何限速(控制下载和上传速度)

转自 http://www.blogjava.net/canvas/articles/bandwidthlimiter.html

这里简单的讨论一下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为例
速度控制
 1 package com.actiontec.net.bandwidth;
 2 
 3 /**
 4  * 
 5  * @author Le
 6  * 
 7  */
 8 public class BandwidthLimiter {
 9 
10     /* KB */
11     private static Long KB = 1024l;
12 
13     /* The smallest count chunk length in bytes */
14     private static Long CHUNK_LENGTH = 1024l;
15 
16     /* How many bytes will be sent or receive */
17     private int bytesWillBeSentOrReceive = 0;
18 
19     /* When the last piece was sent or receive */
20     private long lastPieceSentOrReceiveTick = System.nanoTime();
21 
22     /* Default rate is 1024KB/s */
23     private int maxRate = 1024;
24 
25     /* Time cost for sending CHUNK_LENGTH bytes in nanoseconds */
26     private long timeCostPerChunk = (1000000000l * CHUNK_LENGTH)
27             / (this.maxRate * KB);
28 
29     /**
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值