限制Java的上传速度?

Naf*_*Kay 5 java theory network-programming bandwidth-throttling

我想以编程方式限制Java中的上传或下载操作.我会假设我需要做的就是检查上传的速度和插入方式Thread.sleep(),如下所示:

while (file.hasMoreLines()) {
    String line = file.readLine();
    for (int i = 0; i < line.length(); i+=128) {
        outputStream.writeBytes(line.substr(i, i+128).getBytes());
        if (isHittingLimit())
            Thread.sleep(500);
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码会起作用吗?如果没有,有更好的方法吗?有没有一个描述这个理论的教程?

Fra*_*nck 7

令牌桶算法是一种限制上载或下载带宽的方法.您应该阅读本文:它解释了此算法的用法.

使用番石榴RateLimiter:

// rate = 512 permits per second or 512 bytes per second in this case
final RateLimiter rateLimiter = RateLimiter.create(512.0); 

while (file.hasMoreLines()) {
    String line = file.readLine();
    for (int i = 0; i < line.length(); i+=128) {
        byte[] bytes = line.substr(i, i+128).getBytes();
        rateLimiter.acquire(bytes.length);
        outputStream.writeBytes(bytes);
    }
}
Run Code Online (Sandbox Code Playgroud)

正如Guava文档中所解释的那样: 重要的是要注意,请求的许可数量永远不会影响请求本身的限制(对acquire(1)的调用和对acquire(1000)的调用将导致完全相同的限制,如果任何),但它会影响下一个请求的限制.即,如果一个昂贵的任务到达空闲的RateLimiter,它将立即被授予,但它是下一个将经历额外限制的请求,从而支付昂贵任务的成本.