日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > C# >内容正文

C#

C# WPF网络实时监测客户端

發(fā)布時(shí)間:2023/12/20 C# 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C# WPF网络实时监测客户端 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

? ? ? ?前段時(shí)間一個(gè)客戶項(xiàng)目,現(xiàn)場(chǎng)部署的是無(wú)線網(wǎng)絡(luò),使用我們系統(tǒng)的時(shí)候,發(fā)現(xiàn)總在某些時(shí)間段出現(xiàn)請(qǐng)求特別慢,并且客戶有三個(gè)工廠,一工廠、二工廠使用的沒(méi)問(wèn)題,唯獨(dú)三工廠一直出現(xiàn)問(wèn)題,經(jīng)過(guò)幾次與客戶方IT交流,始終不承認(rèn)是網(wǎng)絡(luò)有問(wèn)題,估計(jì)是因?yàn)楹ε聯(lián)?zé)任,因此不得不寫(xiě)一個(gè)程序,來(lái)實(shí)現(xiàn)實(shí)時(shí)網(wǎng)絡(luò)監(jiān)測(cè),以洗清我們的責(zé)任(這就是甲方和乙方,甲方是大爺,乙方不如甲方的狗)。

一、需求分析

? ? ? ? 我們的目標(biāo)是實(shí)時(shí)監(jiān)測(cè)網(wǎng)絡(luò)情況,我們沒(méi)有小工具前是如何做的呢?正常情況下,依靠windows系統(tǒng)的時(shí)候我們都是用打開(kāi)命令窗口,用ping ip 的方式,看看網(wǎng)絡(luò)有沒(méi)有很大的延遲。好了,我們也不要做的太復(fù)雜,第一點(diǎn)就是實(shí)現(xiàn)這個(gè)ping。然后,我們想到,如果只是ping一次,那么我們還要這個(gè)工具干嘛?為啥不每次手動(dòng)輸入呢?所以,第二點(diǎn)我們需要實(shí)現(xiàn)自動(dòng)長(zhǎng)時(shí)間ping,有點(diǎn)像 ping -t 的命令。我們只是查看這個(gè)結(jié)果還不行,還需要有個(gè)記錄,就像數(shù)據(jù)庫(kù)一樣的東西,記錄下來(lái),這樣也好分析時(shí)間等等因素,這就是第三點(diǎn),我們要實(shí)現(xiàn)日志記錄功能。再想想,還有什么需要我們做的嗎?對(duì),如果能在界面上隨意添加一個(gè)ip,我們就可以實(shí)現(xiàn)ping,多好,對(duì),這就是我們要實(shí)現(xiàn)的第四點(diǎn)功能,ip可以隨時(shí)添加,隨時(shí)移除。大概就是這么多了,以后有其他的功能在慢慢迭代吧!

?

二、概要設(shè)計(jì)

? ? ? ?首先,按照一個(gè)產(chǎn)品的生命周期來(lái)算,我應(yīng)該出一個(gè)設(shè)計(jì)圖了,不管是用什么工具畫(huà)的,至少需要一個(gè)什么樣的圖,以指導(dǎo)開(kāi)發(fā),當(dāng)然,這里的開(kāi)發(fā)就我一個(gè)人,誰(shuí)讓我沒(méi)有一個(gè)開(kāi)發(fā)團(tuán)隊(duì)呢(不用急,樓主以后肯定會(huì)有的)?好,下面我就用最簡(jiǎn)單的windows 畫(huà)圖工具畫(huà)一個(gè),簡(jiǎn)單省事。

? ? ? ? ? ? ??

? ? ? ? ? 上面就是設(shè)計(jì)圖,是不是超簡(jiǎn)單,但是清晰明了,我要的東西上面都有。

三、詳細(xì)設(shè)計(jì)

? ? ? ? ?下面就開(kāi)始枯燥乏味的編碼了,嗯,就是編碼,而且是枯燥乏味的。

1、畫(huà)界面

? ? ? ? ?用的是WPF,所以界面的畫(huà)法其實(shí)跟前端寫(xiě)頁(yè)面差不多,這里就直接上代碼了。

<Window x:Class="NetWork_Watch.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:NetWork_Watch"mc:Ignorable="d"Icon="Resource/ico.ico"ContentRendered="window_contentRendered"Closing="Window_Closing"Title="Network Watch" Height="700" Width="800" ResizeMode="CanMinimize"><Grid Name="MainGrid"><Grid.RowDefinitions><RowDefinition Height="300"/><RowDefinition Height="400"/></Grid.RowDefinitions><Grid Name="TopGrid" Grid.Row="0"><Grid.RowDefinitions><RowDefinition Height="300"></RowDefinition></Grid.RowDefinitions><Rectangle Fill="#EEEEEE" HorizontalAlignment="Right" Margin="0,0,400,10" Width="390"/><Rectangle Fill="#EEEEEE" Height="290" Margin="400,0,0,0" VerticalAlignment="Top" Width="390"/><Label x:Name="label" Content="設(shè)置" HorizontalAlignment="Left" FontSize="20" FontWeight="Bold" Margin="10,10,0,0" VerticalAlignment="Top"/><Label x:Name="ip_lab" Content="IP/網(wǎng)址:" FontSize="14" HorizontalAlignment="Left" Margin="40,80,0,0" VerticalAlignment="Top"/><TextBox x:Name="ip_tb" HorizontalAlignment="Left" FontSize="14" Height="30" Margin="120,80,0,0" TextWrapping="Wrap" VerticalAlignment="Top" VerticalContentAlignment="Center" Width="240"/><Button x:Name="remove_btn" Content="移 除" HorizontalAlignment="Left" Margin="69,180,0,0" VerticalAlignment="Top" Width="75" Height="30" FontSize="16" Click="button_remove_Click"/><Button x:Name="add_btn" Content="添 加" HorizontalAlignment="Left" Margin="270,180,0,0" VerticalAlignment="Top" Width="75" Height="30" FontSize="16" Click="button_add_Click"/><Label x:Name="label1" Content="IP/網(wǎng)址" HorizontalAlignment="Left" FontSize="20" FontWeight="Bold" Margin="420,10,0,0" VerticalAlignment="Top"/><DataGrid x:Name="log_dg" IsReadOnly="True" ItemsSource="{Binding}" HorizontalAlignment="Left" Margin="420,50,0,0" VerticalAlignment="Top" Height="230" Width="350" SelectionChanged="log_dg_SelectionChanged"><DataGrid.Columns><DataGridTextColumn Header="IP/網(wǎng)址" Width="150" Binding="{Binding ip}"/><DataGridTextColumn Header="創(chuàng)建時(shí)間" Width="*" Binding="{Binding createTime}"/></DataGrid.Columns></DataGrid></Grid><Grid Name="BottomGrid" Grid.Row="1" Margin="0,0,0,30"><Grid.RowDefinitions><RowDefinition Height="400"></RowDefinition></Grid.RowDefinitions><Rectangle Fill="#EEEEEE" HorizontalAlignment="Left" Margin="0,10,0,0" Width="800" Height="400" VerticalAlignment="Top"/><Label x:Name="label2" Content="日志統(tǒng)計(jì)" HorizontalAlignment="Left" Margin="10,20,0,0" FontSize="20" FontWeight="Bold" VerticalAlignment="Top"/><TextBox x:Name="log_tb" HorizontalAlignment="Left" Height="290" Margin="10,60,0,0" VerticalAlignment="Top" Width="760"/></Grid></Grid> </Window>

對(duì)應(yīng)的 vs 2015會(huì)顯示出界面效果,如下:

? ? ??

界面算是布局完成了,接下來(lái),需要實(shí)現(xiàn)邏輯了。

2、實(shí)現(xiàn)添加、移除IP、網(wǎng)址功能
? ? ? ?要實(shí)現(xiàn)移除添加ip功能,其實(shí)就是對(duì)一個(gè)list 進(jìn)行插入和刪除就行了。因?yàn)樵谶@里做的比較簡(jiǎn)單,所以沒(méi)有用存儲(chǔ)數(shù)據(jù)庫(kù)或者文件的方式進(jìn)行序列化ip,而是每次打開(kāi)這個(gè)小工具的時(shí)候進(jìn)行添加要監(jiān)聽(tīng)的ip。

? ? ? 定義一個(gè)實(shí)體類(lèi),用來(lái)定義一個(gè)ip的添加時(shí)間以及ip地址,如下:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace NetWork_Watch {public class IpInfo{public string ip { set; get; }public string createTime { set; get; }public IpInfo(string ip){this.ip = ip;this.createTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");}} }

對(duì),很簡(jiǎn)單,就是一個(gè)ip,一個(gè)創(chuàng)建時(shí)間,構(gòu)造方法就是傳入一個(gè)ip,然后自動(dòng)記錄時(shí)間。用一個(gè)全局的list來(lái)存儲(chǔ)當(dāng)前所有插入的ip地址信息,寫(xiě)在界面布局對(duì)應(yīng)的cs文件中。

ObservableCollection<IpInfo> list = new ObservableCollection<IpInfo>();

添加、移除按鈕事件如下:

private void button_add_Click(object sender, RoutedEventArgs e){bool flag = false;for(int i = 0; i< list.Count; i++){if(list[i].ip == ip_tb.Text){flag = true;break;}}if (!flag){IpInfo ipInfo = new IpInfo(ip_tb.Text);list.Add(ipInfo);log_tb.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")+"-增加監(jiān)聽(tīng)客戶端:" + ipInfo.ip);log_tb.AppendText(Environment.NewLine);}else{MessageBox.Show("已存在需要添加的ip,無(wú)法重復(fù)添加。", "提示", MessageBoxButton.OK,MessageBoxImage.Error);}}private void button_remove_Click(object sender, RoutedEventArgs e){for (int i = 0; i < list.Count; i++){if (list[i].ip == ip_tb.Text){ip_tb.Text = null;log_dg.SelectedItem = null;list.RemoveAt(i);i--;}}}

這樣就可以實(shí)現(xiàn)動(dòng)態(tài)的添加、刪除ip了。

嗯,第一步效果實(shí)現(xiàn)了。

3、實(shí)現(xiàn)日志記錄功能

? ? ? ? 看到上面日志統(tǒng)計(jì)里面的信息了嗎?這個(gè)只會(huì)在程序開(kāi)著的時(shí)候進(jìn)行顯示,我現(xiàn)在要記錄到文件中怎么辦?聯(lián)想起Java 里面用的日志組件,log4j,嗯,肯定有c# 版的,打開(kāi)NuGet,搜索,結(jié)果如下:

果然,有此神物,點(diǎn)擊安裝,然后創(chuàng)建配置文件,至于配置文件怎么配置在這就不詳細(xì)解說(shuō)了。我的配置如下:

<?xml version="1.0" encoding="utf-8" ?> <configuration><configSections><section name="log4net" type="System.Configuration.IgnoreSectionHandler"/></configSections><log4net><appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"><!--日志存儲(chǔ)位置--><file value="logs\log.log"/><appendToFile value="true"/><rollingStyle value="Composite"/><datePattern value="yyyyMMdd"/><maxSizeRollBackups value="10"/><maximumFileSize value="1MB"/><layout type="log4net.Layout.PatternLayout"><!--日志輸出格式--><conversionPattern value="%date [%thread] %-5level %logger - %message%newline"/></layout></appender><root><level value="All"/><appender-ref ref="RollingLogFileAppender"/></root></log4net><startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/></startup> </configuration>

配置完日志就沒(méi)事了嗎?不,還有一步,必須配置不可,在AssemblyInfo.cs添加如下一行,相當(dāng)于注冊(cè)組件吧!

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", ConfigFileExtension = "config", Watch = true)]

配置好了,該使用了。

在類(lèi)的最上面,實(shí)例化組件,

private static log4net.ILog logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

然后你就可以在你想要使用的地方瀟灑的使用了,例如:

logger.Info("增加監(jiān)聽(tīng)客戶端:" + ipInfo.ip);

在我們項(xiàng)目文件夾下面,將會(huì)產(chǎn)生一個(gè)log的文件夾,這個(gè)是在config中配置的路徑,同時(shí)log文件夾中會(huì)有一個(gè)log文件,打開(kāi)查看如下:

2019-03-26 10:41:19,763 [1] INFO NetWork_Watch.MainWindow - 增加監(jiān)聽(tīng)客戶端:192.168.113.15

好了,日志功能實(shí)現(xiàn)了。

4、實(shí)現(xiàn)監(jiān)聽(tīng)

? ? ? ? 前面做了這么多,都是為了這一步做鋪墊,要想時(shí)刻進(jìn)行監(jiān)聽(tīng),就需要用一個(gè)循環(huán),在不停的跑,然后實(shí)現(xiàn)實(shí)時(shí)監(jiān)聽(tīng)。其實(shí)我們只需要對(duì)存儲(chǔ)ip的list進(jìn)行不斷的ping,即可完成需求。c# 的Ping 類(lèi)可以解決我們發(fā)送請(qǐng)求的問(wèn)題,while(true)可以實(shí)現(xiàn)我們不斷循環(huán)的需要。因此,我們就用這個(gè)來(lái)實(shí)現(xiàn)吧!

Thread _ping = null;ObservableCollection<IpInfo> list = new ObservableCollection<IpInfo>();public MainWindow(){InitializeComponent();_ping = new Thread(PingRemote);_ping.Start();}void PingRemote(){while (true) { for(int i = 0; i< list.Count; i++){string host = list[i].ip;PingReply reply = p1.Send(host,10); //發(fā)送主機(jī)名或Ip地址if (reply.Status == IPStatus.Success){logger.Info("遠(yuǎn)程地址:" + host + "請(qǐng)求連接成功,往返時(shí)間:" + reply.RoundtripTime + ",TTL:" + reply.Options.Ttl);sendTBlog("遠(yuǎn)程地址:" + host + "請(qǐng)求連接成功,往返時(shí)間:" + reply.RoundtripTime + ",TTL:" + reply.Options.Ttl); }else if (reply.Status == IPStatus.TimedOut){logger.Error("遠(yuǎn)程地址:" + host + "請(qǐng)求連接超時(shí)!");sendTBlog("遠(yuǎn)程地址:" + host + "請(qǐng)求連接超時(shí)!"); }else{logger.Error("遠(yuǎn)程地址:" + host + "請(qǐng)求連接失敗!");sendTBlog("遠(yuǎn)程地址:" + host + "請(qǐng)求連接失敗!");// 為了防止一直處于ping中,這里每次暫停10秒。 }Thread.Sleep(10*1000);}}}private void sendTBlog(string message){// 注意,此處不能直接寫(xiě)輸出到控件,因?yàn)檫@是另起的線程,會(huì)報(bào)錯(cuò)。log_tb.Dispatcher.BeginInvoke(new Action(() => { log_tb.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") +"-"+message); }));log_tb.Dispatcher.BeginInvoke(new Action(() =>{log_tb.AppendText(Environment.NewLine);}));}

在創(chuàng)建界面的時(shí)候,就把線程打開(kāi),這樣后面添加一項(xiàng)就會(huì)自動(dòng)進(jìn)行ping,最后實(shí)現(xiàn)效果:

一個(gè)簡(jiǎn)單好用的小工具,就這樣實(shí)現(xiàn)了,雖然還有很多不足,但是可以完美解決我目前面臨的問(wèn)題。

總結(jié)

以上是生活随笔為你收集整理的C# WPF网络实时监测客户端的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。