Java文件传输带宽控制_如何限制Java中的带宽?

我写了一个Java调度程序,每小时使用:

new SAXBuilder().build(new URL(xxx));

要么

HttpConnection.connect(new URL(xxx)); // jsoup library code

获取一个大的XML / HTML文件.

我的服务器最大带宽限制是2Mbits.

当这个Java调度代码运行时,我使用超过2Mbits的带宽. (check it out)

因此,每次用户访问我的服务器时,它都太慢了.

如何限制Java计划使用较低的带宽?

(例如500Kbits)

我正在使用Ubuntu服务器.

解决方法:

没有优雅的方法来做到这一点.

一种简单但不优雅的方法是编写一个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),并且可能在该过程中丢弃数据分组.最终,需要重新传输这些数据包.

标签:java

来源: https://codeday.me/bug/20190923/1815647.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值