java 带宽控制,如何限制Java中的带宽?

I wrote a Java scheduler, every hour using:

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

or

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

to get a big XML/HTML file.

My server maximum bandwidth limit is 2Mbits.

When this Java schedule code runs, I use over 2Mbits of bandwidth. (check it out)

So every time a user visits my server it is too slow.

How do I limit my Java schedule to use lower bandwidth?

(ex. 500Kbits)

I am using Ubuntu server.

解决方案

There's no elegant way to do this.

A simple but inelegant way would be to write a Java stream wrapper that limits the rate at which bytes are read from the wrapped Stream. For instance, if you wanted to limit to 1000 bytes per second, the int read() method could be implemented as follows:

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;

}

It is worth noting that throttling rates like this can have negative as well as positive effects. On the negative side:

It ties down resources on the server side for longer. In this case, we are talking about the Java thread that is handling the download, and memory in kernel space is used to buffer received network packets until the application reads them.

It may also lead to more network traffic. The problem is that this kind of throttling will disrupt the smooth flow of packets. The server will only buffer a relatively small number of packets, and when that number is exceeded, it has to tell the client to STOP for now. This requires extra signalling packets (ACKs) and there will probably be data packets dropped in the process. Eventually, those data packets will need to be retransmitted.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值