HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://www.baidu.com"); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream receiveStream = response.GetResponseStream(); byte[] bf = new byte[20]; int count = receiveStream.Read(bf, 0, 20); while (count > 0) { count = receiveStream.Read(bf, 0, 20);//疑问就在这一句, //我想请问一下,Stream.Read()这个方法,工作的时候是如何从互联网上获取信息的,? //因为,经过我测试,好像每调用一次Stream.Read(),会从互联网下载64KB左右的信息,(至于储存到哪了,不太清楚) //然后直到循环调用Stream.Read()所得到的信息达到64K之后,才会再次从互联网读取64k //这是我通过360,以及网卡流量监控软件测试出来的结果, } receiveStream.Close(); response.Close();
想请问一下,stream.read 这个方法是如何工作的,
如果真如我猜想的,那么需要如果控制每次下载的信息的大小(即每次下载的64K)
程序中的速度限制没必要做得那么精确,一般来说通过暂停来实现速度限制就可以了。基本方式方式是:
你好,感谢你的回复.
其实我目前也是这个方法来实现的,但是Stream有一个缓冲区,我测试了一下,大小大概在64k左右,
也就是说,如果我设置速度为20k,缓冲区会在第一秒直接下载64k的信息,然后后面两秒根本不会下载.
@发粪图墙:
GetResponseStream 函数返回的stream本身是没有缓冲功能的,但操作系统内核是有读缓冲的。
多读的缓冲数据所耗的时间也是非常短的,对于应用程序来说一般是不用感知的。不会像你所假象的那样到了秒级,是不影响你的限速功能的。
另外,感觉你的64k这个数据获取得也不靠谱,你只是获取一些html网页,传输过程中总共都没有64k数据。
@天方:
确实一个网页没有64K的大小,所以我为了测试做了一个很大的页面,放到自己的服务器上,供程序去访问,
64K的数字是我把程序打开以后,测速软件反映出来的结果,
像你说的操作系统中的缓冲大小是否是可以修改的呢?
我的大部分应用都是访问网页,所以想高效的利用带宽,因此想控制带宽的使用速度.
@发粪图墙:
操作系统底层传输有控制的,不会出现一个连接占用大量带宽而其他连接饿死的。
你可以改一下测试方法,对于你那个很大的页面,同时开启100个连接,每个连接只调用一次stream.read函数,看此时的带宽占用是64k还是6400k。
@天方: 开启100个连接是肯定达不到6400k的,因为我的宽带没有那么高,
我用了4个连接,每一个读一次的话,就会从64一下增长到250多,然后继续2秒没有下载,再次上升到250.
我是想调整缓存区的大小,目的是为了,控制每秒平均使用带宽,并且实现限制带宽使用率的问题.
@发粪图墙:
这个你要么在站点上设置限流,要么在本地设置限流。貌似
HttpWebRequest 没有限流的API吧?
@luofer: API好像是没有,我主要是获取htmlSource使用,貌似C#做这个功能很吃力
@发粪图墙:
跟踪自己的应用程序,来调整这个应用程序的流量吗?
为什么不监控整个流量,忙时控制应用程序少发些,闲时就多发些。