【工作记录】模拟实现“实时监控网速”之思路与实现

来源:互联网 发布:知返全文txt下载 编辑:程序博客网 时间:2024/05/06 15:12

      因工作需要,游戏在下载过程需要于界面显示当前每个游戏的下载速度,下载进度。

      百度一下,“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这个方法,后一秒和前一秒下载量之差,请自行计算,代码仅供参考)。

       至此,获取本机当前的实时网速也就实现了。



       

        


        

        

1 0
原创粉丝点击