数据来了,你只要不从InputStream里面读取就限速了啊,缓冲区满了,对方就发不动了。如果要精确限速,就是根据时间间隔从InputStream读取数据。比如你的每次读取都是 byte[1024] 也就是1KB,如果要控制上传速度是 10KB/s,那么粗略点的控制方式就是每隔100ms读取一次1KB。

解决方案 »

  1.   

    不太同意LS的看法,在客户端塞满缓冲区的话可能会导致数据包被丢弃的,下载限速还是要在PEER端来控制,你客户端要通知和你连接的PEER控制发出的流量,就像TCP里的窗口算法一样有一个协商的过程
      

  2.   


    迅雷是通过这种方式实现的么?我试了一下,很难做到想迅雷那样精确的说。
    比如我限速400KB/s,然后延时1000/400ms去读一次缓冲区,每次读1K,最后在360加速球上显示的速度是340KB/s
      

  3.   


    原理是这么个原理,但是具体实现起来,控制的方式很多样。精确度要比较高的控制的话,一个是读取频度要高,另一个是需要采用增量计算的方式。否则每两次读取之间所浪费的时间开销,和读取本身的时间开销你就没有计入了。再另外就是你用Sleep的方式控制间隔,本身也不准确。简易模型可以这么做(假定期望控制速度为 100KB/s):
    ◎ 获取当前时间戳 current;
    ◎ 计算当前时间距离上次读取时间实际间隔多少ms;
    ◎ 计算这段间隔时间内,按目标控制速度,应读取的字节数;
    ◎ 将当前时间戳 current 时间设置给 上次读取时间戳 last
    ◎ Sleep 10ms;
    ◎ 循环到最前面这样你的模型可以把几乎所有时间开销都计算在内。