因工作需要,游戏在下载过程需要于界面显示当前每个游戏的下载速度,下载进度。
百度一下,“C#如何获取当先网速的下载速度”,网友热评,实时获取是不可能的,十脸茫然。而且,对于迅雷这样的网站,下载速度的显示,也都是通过程序计算得到的,而非实时拿到。
不过,要做这个活,有两个思路:
1、“通过StopWatch或者通过一个一直在跑的子线程,Thread.Sleep(某时间)来计算从服务器拿到的数据流量”除以时长,获得的计时当前的这个时间段内的评论速度。
2、假设时间间隔设置为1s,从服务器拿下来的数据流量传到一个变量M中,每1s计算一次,用后一秒时刻M的大小与前一秒时刻M的大小做差,差值即为实时网速,而且这种方法的好处在于,对于多个游戏同时下载,多个线程从服务器拿数据,用多个M变量来表示不同的游戏,从而可以实时获取到每个游戏具体的下载速度,同时用M的值除以该游戏的大小,也获得了当前的下载百分比。
由方法一推导出方法二,便实现了下载方法的建模工作。
实现步骤:
1、实例化stream流对象,用于充当M,接收从指定URL下,下载的游戏内容。
2、通过开启一个/多个子线程(按游戏个数来定),while(true)无线循环,计算出每秒的流量大小,显示到界面。
(此处代码暂时不予公开,有了套路,请自行实现)
Code Project上一个类似的做法:
前些天逛一个开源网站,发现.net集成的一些机制也是可以实现这个功能,就予以分享:
一个.dll文件NetWorkMonitor:====>(Please Click Me)
思路:
通过检测本机活跃的网卡,然后监听特定网卡的下载量,我做了测试,发现我的电脑有三张活跃网卡, 每张都有下载速度,用foreach()做了遍历,代码如下:
private NetworkAdapter[] adapters; //声明网卡适配器列表
private NetworkMonitor monitor = new NetworkMonitor(); //声明检测器
static double SpeedTest = 0;
上面三个变量,与NewWorkMonitor这个dll有关,
public void TestSet()
{
adapters = monitor.Adapters;
while (true)
{
foreach (var item in adapters)
{
monitor.StopMonitoring();
monitor.StartMonitoring(item);
SpeedTest += item.DownloadSpeedKbps;
}
Thread.Sleep(1000); //遍历完活跃的网卡后,累积出当前所有网卡的下载量之和
}
}
同时,修改了这个方法的调用准则,查看当前活跃的网卡:
Task DownLoadSpeed = new Task(()=>
{
TestSet();
})
这个子线程一起,就会一直发送当前网络的实时下载速度。(TestSet这个方法,后一秒和前一秒下载量之差,请自行计算,代码仅供参考)。
至此,获取本机当前的实时网速也就实现了。