JAVA怎么实现下载上传限速 数据来了,你只要不从InputStream里面读取就限速了啊,缓冲区满了,对方就发不动了。如果要精确限速,就是根据时间间隔从InputStream读取数据。比如你的每次读取都是 byte[1024] 也就是1KB,如果要控制上传速度是 10KB/s,那么粗略点的控制方式就是每隔100ms读取一次1KB。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不太同意LS的看法,在客户端塞满缓冲区的话可能会导致数据包被丢弃的,下载限速还是要在PEER端来控制,你客户端要通知和你连接的PEER控制发出的流量,就像TCP里的窗口算法一样有一个协商的过程 迅雷是通过这种方式实现的么?我试了一下,很难做到想迅雷那样精确的说。比如我限速400KB/s,然后延时1000/400ms去读一次缓冲区,每次读1K,最后在360加速球上显示的速度是340KB/s 原理是这么个原理,但是具体实现起来,控制的方式很多样。精确度要比较高的控制的话,一个是读取频度要高,另一个是需要采用增量计算的方式。否则每两次读取之间所浪费的时间开销,和读取本身的时间开销你就没有计入了。再另外就是你用Sleep的方式控制间隔,本身也不准确。简易模型可以这么做(假定期望控制速度为 100KB/s):◎ 获取当前时间戳 current;◎ 计算当前时间距离上次读取时间实际间隔多少ms;◎ 计算这段间隔时间内,按目标控制速度,应读取的字节数;◎ 将当前时间戳 current 时间设置给 上次读取时间戳 last◎ Sleep 10ms;◎ 循环到最前面这样你的模型可以把几乎所有时间开销都计算在内。 接口我能这样理解吗? 如何使用Properties类加载XML属性文件? 关于两个函数的分辨问题 我被折磨死了 请问大家一个replaceALL()函数的问题 在内部类里访问外部类的成员出现错误,如何解决,谢谢 java问题,能编译却不能运行,小白求详解 关于 OO 及虚拟机的简单认识 关于获得本地字体的问题 Java中数组为null httpclient 4.3 通过验证码登录总是失败,请高手指教! java应用自动升级如何实现
迅雷是通过这种方式实现的么?我试了一下,很难做到想迅雷那样精确的说。
比如我限速400KB/s,然后延时1000/400ms去读一次缓冲区,每次读1K,最后在360加速球上显示的速度是340KB/s
原理是这么个原理,但是具体实现起来,控制的方式很多样。精确度要比较高的控制的话,一个是读取频度要高,另一个是需要采用增量计算的方式。否则每两次读取之间所浪费的时间开销,和读取本身的时间开销你就没有计入了。再另外就是你用Sleep的方式控制间隔,本身也不准确。简易模型可以这么做(假定期望控制速度为 100KB/s):
◎ 获取当前时间戳 current;
◎ 计算当前时间距离上次读取时间实际间隔多少ms;
◎ 计算这段间隔时间内,按目标控制速度,应读取的字节数;
◎ 将当前时间戳 current 时间设置给 上次读取时间戳 last
◎ Sleep 10ms;
◎ 循环到最前面这样你的模型可以把几乎所有时间开销都计算在内。