欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#實(shí)現(xiàn)網(wǎng)絡(luò)小程序的步驟詳解

 更新時(shí)間:2022年12月27日 08:13:27   作者:dawn  
經(jīng)常要檢測(cè)某些IP地址范圍段的計(jì)算機(jī)是否在線。有很多的方法,比如進(jìn)入到網(wǎng)關(guān)的交換機(jī)上去查詢、使用現(xiàn)成的工具或者編寫一個(gè)簡(jiǎn)單的DOS腳本等等,這些都比較容易實(shí)現(xiàn)。本文將用C#來實(shí)現(xiàn),感興趣的可以了解一下

經(jīng)常要檢測(cè)某些IP地址范圍段的計(jì)算機(jī)是否在線。

有很多的方法,比如進(jìn)入到網(wǎng)關(guān)的交換機(jī)上去查詢、使用現(xiàn)成的工具或者編寫一個(gè)簡(jiǎn)單的DOS腳本等等,這些都比較容易實(shí)現(xiàn)。

現(xiàn)在使用C#來完成。

1、簡(jiǎn)單上手

公用函數(shù):

        public static long IPToLong(string ip)
        {
            //將IP地址轉(zhuǎn)換為長(zhǎng)整數(shù)
            string[] ipBytes = ip.Split('.');
            long ipLong = 0;
            ipLong += long.Parse(ipBytes[0]) * 256 * 256 * 256;
            ipLong += long.Parse(ipBytes[1]) * 256 * 256;
            ipLong += long.Parse(ipBytes[2]) * 256;
            ipLong += long.Parse(ipBytes[3]);
            return ipLong;
        }
 
        public static string LongToIP(long ip)
        {
            //將長(zhǎng)整數(shù)IP地址轉(zhuǎn)換為實(shí)際的IP地址
            long ipLong = ip;
            string ipString = string.Empty;
            ipString += ipLong / 256 / 256 / 256 + ".";
            ipLong = ipLong % (256 * 256 * 256);
            ipString += ipLong / 256 / 256 + ".";
            ipLong = ipLong % (256 * 256);
            ipString += ipLong / 256 + ".";
            ipLong = ipLong % 256;
            ipString += ipLong;
            return ipString;
        }

點(diǎn)擊【檢測(cè)】按鈕:

            DateTime startTime, endTime;
            startTime= DateTime.Now;
            listBox1.Items.Add(startTime.ToString());
            string startIP = textBox1.Text;
            string endIP = textBox2.Text;
 
            // 將起始IP地址和結(jié)束IP地址轉(zhuǎn)換為長(zhǎng)整數(shù) 
            long startIPLong = IPToLong(startIP);
            long endIPLong = IPToLong(endIP);
 
            Ping ping = new Ping();
            // 遍歷IP地址范圍 
            for (long i = startIPLong; i <= endIPLong; i++)
            {
                // 將整數(shù)轉(zhuǎn)換為IP地址 
                string ip = LongToIP(i);
 
                // 輸出 
                PingReply pingReply = ping.Send(ip);
                if (pingReply.Status == IPStatus.Success)
                {
                    listBox1.Items.Add( ip + "=>計(jì)算機(jī)在線");
                }
                else
                {
                    listBox1.Items.Add(ip);
                }
 
            }
            endTime = DateTime.Now;
            listBox1.Items.Add(endTime.ToString());
            listBox1.Items.Add("OK:" + (endTime - startTime).ToString());

執(zhí)行時(shí)沒有問題的,可以出來結(jié)果,問題是界面卡頓了。

執(zhí)行的時(shí)間也很長(zhǎng),執(zhí)行需要1分21秒。

這個(gè)結(jié)果不能接受,需要對(duì)程序加以改進(jìn)。

2、使用并行計(jì)算

不需要改動(dòng)公用代碼,只需要改動(dòng)檢測(cè)部分。

            Dictionary<string, string> ipResults = new Dictionary<string, string>();
 
            DateTime startTime, endTime;
            startTime = DateTime.Now;
            listBox1.Items.Add(startTime.ToString());
 
            string startIP = textBox1.Text;
            string endIP = textBox2.Text;
 
            // 將起始IP地址和結(jié)束IP地址轉(zhuǎn)換為整數(shù) 
            long startIPLong = IPToLong(startIP);
            long endIPLong = IPToLong(endIP);
 
            // 創(chuàng)建一個(gè)可以存儲(chǔ)IP地址的List
            List<string> ipList = new List<string>();
 
            for (long i = startIPLong; i <= endIPLong; i++)
            {
                // 將整數(shù)轉(zhuǎn)換為IP地址 
                string ip = LongToIP(i);
                ipList.Add(ip);
                ipResults.Add(ip,"");
                listBox1.Items.Add(ip);
            }
 
            // 開啟并行計(jì)算
            Parallel.ForEach(ipList, (ip) =>
            {
            // 創(chuàng)建一個(gè)新的Ping類
            Ping pingSender = new Ping();
            // 發(fā)送一個(gè)Ping請(qǐng)求
            var reply = pingSender.Send(ip);
 
            // 如果返回的狀態(tài)是Success,則IP地址在線
            if (reply.Status == IPStatus.Success)
            {
                ipResults[ip] = "在線";
                ChangeIPStatus(ip,"在線");
                }
                else
                {
                    ipResults[ip] = "NO";
                    ChangeIPStatus(ip, "NO");
                }
            });
 
            endTime = DateTime.Now;
            listBox1.Items.Add(endTime.ToString());
            listBox1.Items.Add("OK:" + (endTime - startTime).ToString());

增加一個(gè)公用函數(shù):

       public void ChangeIPStatus(string ip,string S1)
        {
            // 定位到listbox中記錄并更改IP是否在線
            int index = listBox1.Items.IndexOf(ip);
            listBox1.Items[index] = ip+" "+S1;
        }

出現(xiàn)問題:

⑴ 提示“C#線程間操作無效:從不是創(chuàng)建控件“textbox1”的線程訪問它”,這個(gè)就簡(jiǎn)單設(shè)置Control.CheckForIllegalCrossThreadCalls=false即可解決;

⑵ 提示“listbox1包含的項(xiàng)太多”,這個(gè)是不是與并行計(jì)算開啟的線程太多有關(guān)?考慮到本機(jī)是8核,保守一點(diǎn),修改參數(shù)

Parallel.ForEach(ipList, new ParallelOptions() { MaxDegreeOfParallelism = MaxDegreeOfParallelism = Environment.ProcessorCount }, (ip) =>
{
    //執(zhí)行代碼   
}

程序可以正常運(yùn)行了。

⑶ 界面依然阻塞,但用時(shí)更多了。

去ping255個(gè)地址,竟然用了12分32秒!??!這個(gè)真是不可忍受,最關(guān)鍵沒有界面交互,這太不用戶友好了!

3、添加異步編程

            Dictionary<string, string> ipResults = new Dictionary<string, string>();
 
            DateTime startTime, endTime;
            startTime = DateTime.Now;
            listBox1.Items.Add(startTime.ToString());
 
            string startIP = textBox1.Text;
            string endIP = textBox2.Text;
 
            // 將起始IP地址和結(jié)束IP地址轉(zhuǎn)換為整數(shù) 
            long startIPLong = IPToLong(startIP);
            long endIPLong = IPToLong(endIP);
 
            // 創(chuàng)建一個(gè)可以存儲(chǔ)IP地址的List
            List<string> ipList = new List<string>();
 
            for (long i = startIPLong; i <= endIPLong; i++)
            {
                // 將整數(shù)轉(zhuǎn)換為IP地址 
                string ip = LongToIP(i);
                ipList.Add(ip);
                ipResults.Add(ip,"");
                listBox1.Items.Add(ip);
            }
 
            Task task = new Task(() =>
            {
                // 創(chuàng)建一個(gè)多線程
                Parallel.ForEach(ipList, new ParallelOptions() { MaxDegreeOfParallelism = Environment.ProcessorCount }, (ip) =>
                {
                    // 創(chuàng)建一個(gè)新的Ping類
                    Ping pingSender = new Ping();
                    // 發(fā)送一個(gè)Ping請(qǐng)求
                    var reply = pingSender.Send(ip);
 
 
                    if (reply.Status == IPStatus.Success)
                    {
                        listBox1.Invoke(new Action(() =>
                        {
                            int index = listBox1.Items.IndexOf(ip);
                            listBox1.Items[index] = ip + " " + "在線";
                        }));
                    }
                    else
                    {
                        listBox1.Invoke(new Action(() =>
                        {
                            int index = listBox1.Items.IndexOf(ip);
                            listBox1.Items[index] = ip + " " + "NO";
                        }));
                    }
 
                });
            });
 
            task.Start();
            Task.WaitAll();
            endTime = DateTime.Now;
            listBox1.Items.Add(endTime.ToString());
            listBox1.Items.Add("OK:" + (endTime - startTime).ToString());

好了,因?yàn)槭褂肨ask異步編程,界面也不再阻塞和卡頓了,不過運(yùn)行多少時(shí)間不能準(zhǔn)確得到,改動(dòng)一下代碼,就是將時(shí)間輸出定位到任務(wù)完成:

            task.ContinueWith((t) =>
            {
                endTime = DateTime.Now;
                listBox1.Items.Add(endTime.ToString());
                listBox1.Items.Add("OK:" + (endTime - startTime).ToString());
            });

運(yùn)行時(shí)間為1分41秒,界面不卡頓了。

可是運(yùn)行仍然是逐個(gè)IP地址在ping,根本沒有并行計(jì)算的效果。雖然使用了Parallel.ForEach,可能是由于線程需要等待導(dǎo)致資源開銷過大,那么線程沒有被有效地利用。

這其實(shí)與普通的使用線程來做沒有什么區(qū)別了。

4、補(bǔ)充

⑴ 檢測(cè)方法:

            string ipAddress = (string)obj;
            TcpClient client = new TcpClient();
            try
            {
                client.Connect(ipAddress, 80);
                //在線
            }
            catch (Exception ex)
            {
                //不在線
            }
            finally
            {
                client.Close();
            }

引用:

using System.Net.Sockets;

⑵ 檢測(cè)輸入的IP地址是否合法:

    IPAddress address;
    if (IPAddress.TryParse(ipAddress, out address))
    {
        // 檢查IP地址是否為IPv4地址
        if (address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
            return true;
    }else{
        return false;
    }

對(duì)于檢測(cè)計(jì)算機(jī)在線與否沒有好的方法?看那么多的網(wǎng)絡(luò)小工具,肯定有!

先完成這個(gè)效果,后面再進(jìn)行優(yōu)化。

到此這篇關(guān)于C#實(shí)現(xiàn)網(wǎng)絡(luò)小程序的步驟詳解的文章就介紹到這了,更多相關(guān)C#網(wǎng)絡(luò)小程序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#模擬鏈表數(shù)據(jù)結(jié)構(gòu)的實(shí)例解析

    C#模擬鏈表數(shù)據(jù)結(jié)構(gòu)的實(shí)例解析

    這篇文章主要介紹了C#模擬鏈表數(shù)據(jù)結(jié)構(gòu)的實(shí)例解析,包括隊(duì)雙向鏈表的模擬方法,例子中隊(duì)鏈表的操作也有很好的說明,需要的朋友可以參考下
    2016-04-04
  • C#實(shí)現(xiàn)任務(wù)欄通知窗口

    C#實(shí)現(xiàn)任務(wù)欄通知窗口

    作為程序員在享受的同時(shí)我們也不禁要問:這到底是怎么實(shí)現(xiàn)的呢?本文就利用Visual Studio .Net C# 2005以及.Net框架繪圖技術(shù)來實(shí)現(xiàn)這種任務(wù)欄通知窗口。
    2015-10-10
  • C#基于Socket實(shí)現(xiàn)多人聊天功能

    C#基于Socket實(shí)現(xiàn)多人聊天功能

    這篇文章主要為大家詳細(xì)介紹了C#基于Socket實(shí)現(xiàn)多人聊天功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C#實(shí)現(xiàn)猜數(shù)字游戲

    C#實(shí)現(xiàn)猜數(shù)字游戲

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)猜數(shù)字游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C#程序員最易犯的編程錯(cuò)誤

    C#程序員最易犯的編程錯(cuò)誤

    這篇文章主要介紹了C#程序員最易犯的10個(gè)編程錯(cuò)誤,了解這些錯(cuò)誤能夠更好地學(xué)習(xí)C#程序設(shè)計(jì),感興趣的小伙伴們可以參考一下
    2015-11-11
  • 再議C#中的裝箱與拆箱的問題詳解

    再議C#中的裝箱與拆箱的問題詳解

    本篇文章再次介紹了C#中的裝箱與拆箱,這次們看下使用泛型和不使用泛型引發(fā)裝箱拆箱的情況
    2013-05-05
  • C#開發(fā)WinForm項(xiàng)目實(shí)現(xiàn)HTML編輯器

    C#開發(fā)WinForm項(xiàng)目實(shí)現(xiàn)HTML編輯器

    這篇文章介紹了C#開發(fā)WinForm項(xiàng)目實(shí)現(xiàn)HTML編輯器的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • 淺談C#數(shù)組(一)

    淺談C#數(shù)組(一)

    本篇文章小編要得大家介紹的是C#數(shù)組,數(shù)組是一種數(shù)據(jù)結(jié)構(gòu),它可以包含同一個(gè)類型的多個(gè)元素,如果需要使用同一類型的多個(gè)對(duì)象,可以使用數(shù)組和集合,需要的朋友可以參考下面文章的具體內(nèi)容
    2021-09-09
  • C#利用XML創(chuàng)建Excel文檔的實(shí)現(xiàn)方法

    C#利用XML創(chuàng)建Excel文檔的實(shí)現(xiàn)方法

    這篇文章主要介紹了C#利用XML創(chuàng)建Excel文檔的實(shí)現(xiàn)方法,需要的朋友可以參考下
    2014-08-08
  • C#中比較常用的DateTime結(jié)構(gòu)的使用方法

    C#中比較常用的DateTime結(jié)構(gòu)的使用方法

    這篇文章主要介紹了C#中比較常用的DateTime結(jié)構(gòu)的使用方法,需要的朋友可以參考下
    2015-11-11

最新評(píng)論