在使用HttpWebResponse请求网络内容的时候,一般如下面这种方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
// 非生产环境代码,请在实际使用时进行必要调整
// —— Mitchell Chu
// Blog:blog.useasp.net
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
using
(var response = (HttpWebResponse)request.GetResponse())
using
(var stream = response.GetResponseStream())
{
byte
[] buffer =
new
byte
[4096];
int
read = 0;
while
((read = stream.Read(buffer, 0, buffer.Length)) >0){
// buffer...
}
}
|
使用这种方式,一旦我们开始下载数据,即是全速下载——即理论上是客户端和服务端的最小速度为当前下载速度。如果以这个速度持续下载,要不服务端被拖垮,要不就是客户端被服务端封禁。当然,一般情况下,后者居多。在持续的针对某站资源下载的时候,限速是非常必要的。
在HttpWebResponse里面限制下载速度比较简单,只需要控制读取的速度,即可达到限速的目的:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
// 非生产环境代码,请在实际使用时进行必要调整
// —— Mitchell Chu
// Blog:blog.useasp.net
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
using
(var response = (HttpWebResponse)request.GetResponse())
using
(var stream = response.GetResponseStream())
{
byte
[] buffer =
new
byte
[4096];
int
read = 0;
long
total_read = 0;
DateTime begin = DateTime.Now;
TimeSpan ts =
new
TimeSpan();
while
((read = stream.Read(buffer, 0, buffer.Length)) >0){
total_read += read;
ts = DateTime.Now - begin;
if
((total_read / ts.TotalSeconds) > 1024){
Thread.Sleep(1);
// 休息一下.
}
}
}
|