没有优雅的方法来做到这一点.
一种简单但不优雅的方法是编写一个Java流包装器,它限制从包装流中读取字节的速率.例如,如果要限制为每秒1000个字节,则可以按如下方式实现int read()方法:
Stream in;
long timestamp = System.currentTimeInMillis();
int counter = 0;
int INTERVAL = 1000; // one second
int LIMIT = 1000; // bytes per INTERVAL
...
/**
* Read one byte with rate limiting
*/
@Override
public int read() {
if (counter > LIMIT) {
long now = System.currentTimeInMillis();
if (timestamp + INTERVAL >= now) {
Thread.sleep(timestamp + INTERVAL - now);
}
timestamp = now;
counter = 0;
}
int res = in.read();
if (res >= 0) {
counter++;
}
return res;
}
值得注意的是,像这样的节流率可能会产生负面影响和积极影响.在消极方面:
>它将服务器端的资源连接起来的时间更长.在这种情况下,我们讨论的是处理下载的Java线程,内核空间中的内存用于缓冲接收到的网络数据包,直到应用程序读取它们为止.
>它还可能导致更多的网络流量.问题是这种限制会破坏数据包的顺畅流动.服务器只缓冲相对较少数量的数据包,当超过该数量时,它必须告诉客户端暂时停止.这需要额外的信令分组(ACK),并且可能在该过程中丢弃数据分组.最终,需要重新传输这些数据包.