亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > .NET中應(yīng)用程序內(nèi)共享UdpClient聯(lián)機(jī)的實現(xiàn)方法

.NET中應(yīng)用程序內(nèi)共享UdpClient聯(lián)機(jī)的實現(xiàn)方法

熱門標(biāo)簽:戶外地圖標(biāo)注軟件手機(jī)哪個好用 長春呼叫中心外呼系統(tǒng)哪家好 萊蕪?fù)夂綦婁N機(jī)器人價格 凱立德導(dǎo)航官網(wǎng)地圖標(biāo)注 電銷語音自動機(jī)器人 地圖標(biāo)注和認(rèn)領(lǐng) 智能電話營銷外呼系統(tǒng) 鄭州400電話辦理 聯(lián)通 五常地圖標(biāo)注

原始碼下載: MutualUdpClientSample_jb51net.rar

 

在開發(fā)與遠(yuǎn)程設(shè)備通訊的系統(tǒng)時,為了提高數(shù)據(jù)傳輸?shù)男剩3x擇UDP這個通訊協(xié)議來作為數(shù)據(jù)傳輸?shù)拿浇椤6?.NET framework中所提供的UdpClient對象,可以幫助開發(fā)人員依照系統(tǒng)需求開啟UDP套接字點,快速建立UDP聯(lián)機(jī)來提供與遠(yuǎn)程設(shè)備通訊的功能。

 

 

這個系統(tǒng)架構(gòu)下當(dāng)增加一個不同種類的遠(yuǎn)程設(shè)備時,必須要提供一個不同的UDP套接字點,才能用來提供與不同種類遠(yuǎn)程設(shè)備通訊的功能,在遠(yuǎn)程設(shè)備種類越來越多時,系統(tǒng)所需要的UDP套接字點就會依照遠(yuǎn)程設(shè)備種類而增加。

 

 

在遠(yuǎn)程設(shè)備種類越來越多的情景中,為了網(wǎng)絡(luò)管理考慮會限制系統(tǒng)與遠(yuǎn)程設(shè)備通訊時,必須統(tǒng)一使用同一個UDP套接字點來與遠(yuǎn)程設(shè)備通訊,再由封包內(nèi)容、或是IP地址去判斷實際連接的遠(yuǎn)程設(shè)備為何。

復(fù)制代碼 代碼如下:

class Program
{
    static void Main(string[] args)
    {
        // Receiver
        UdpClient udpClientA = new UdpClient(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1234));

        UdpClient udpClientB = new UdpClient(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1234));
    }
}

依照系統(tǒng)需求開發(fā)人員可能寫出上列的程序代碼,直接建立兩個UdpClient對象來開啟同一個UDP套接字點。這段程序代碼內(nèi)容可以通過編譯程序的檢查,但在按下執(zhí)行之后,就會在Visual Studio之中看到SocketException的例外通知,用來告知開發(fā)人員同一個套接字點只能被開啟一次,使用兩個UdpClient來開啟同一個套接字點是無法執(zhí)行的。

 

有涉略過Design pattern的開發(fā)人員,在遇到資源對象只能有一個實體的情景,會想到套用Singleton Pattern來提供資源對象共享的功能。系統(tǒng)中UdpClient對象所開啟的UDP套接字點,就是屬于這種只能由一個對象所開啟的資源,這個情景中在UdpClient對象上套用Singleton Pattern看起來會是個不錯的選擇。

復(fù)制代碼 代碼如下:

class Program
{
    // Singleton
    private static UdpClient _udpClientInstance = null;

    private static UdpClient UdpClientInstance
    {
        get
        {
            if (_udpClientInstance == null)
            {
                _udpClientInstance = new UdpClient(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1234));
            }
            return _udpClientInstance;
        }
    }

 
    // Main
    static void Main(string[] args)
    {
        // Receiver
        UdpClient udpClientA = Program.UdpClientInstance;

        UdpClient udpClientB = Program.UdpClientInstance;

        // Transmiter
        UdpClient transmiter = new UdpClient(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9999));

 
        // Send
        transmiter.Send(new byte[] { 55 }, 1, new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1234));

 
        // Receive
        byte[] packet = null;
        IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, IPEndPoint.MinPort);

        packet = udpClientA.Receive(ref remoteEndPoint);
        Console.WriteLine(string.Format("UdpClientA Receive:{0}", packet[0]));

        packet = udpClientB.Receive(ref remoteEndPoint);
        Console.WriteLine(string.Format("UdpClientB Receive:{0}", packet[0]));

        // End
        Console.ReadLine();

        // Close
        transmiter.Close();
        udpClientB.Close();
        udpClientA.Close();
    }
}

將Singleton Pattern套用在系統(tǒng)內(nèi)所使用的UdpClient物件上,可以寫出上列的程序代碼,系統(tǒng)內(nèi)所使用的UdpClient對象都是取用到系統(tǒng)內(nèi)一個靜態(tài)存放的共享UdpClient對象。這段程序代碼內(nèi)容可以通過編譯程序的檢查,并且在執(zhí)行時也不會出現(xiàn)SocketException的例外通知,因為套用Singleton Pattern讓系統(tǒng)內(nèi)只會開啟UDP套接字點一次。

 

但進(jìn)階一點去思考UdpClient對象的封包接收功能,UdpClient對象中提供Receive方法來等待、接收遠(yuǎn)程設(shè)備傳送的數(shù)據(jù)封包,收到數(shù)據(jù)封包之后再次執(zhí)行Receive方法會繼續(xù)等待、接收下一個數(shù)據(jù)封包。也就是說一個遠(yuǎn)程設(shè)備傳送的數(shù)據(jù)封包,UdpClient只能透過Receive方法取得一次,在系統(tǒng)內(nèi)共享同UdpClient對象,沒有辦法共享Receive方法所取得的數(shù)據(jù)封包。

 

觀察上列范例的執(zhí)行結(jié)果,可以發(fā)現(xiàn)在范例中由transmiter所傳送的資料封包,在被UdpClientA透過Receive方法接收之后,UdpClientB無法接收到這個遠(yuǎn)程傳送的數(shù)據(jù)封包,這也就驗證范例中將Singleton Pattern套用在系統(tǒng)內(nèi)所使用UdpClient上的方式,會發(fā)生了無法共享數(shù)據(jù)封包的問題。

 

 

為了提供系統(tǒng)使用同一個UDP套接字點來與遠(yuǎn)程設(shè)備通訊,再由封包內(nèi)容、或是IP地址去判斷實際連接的遠(yuǎn)程設(shè)備為何的功能。筆者設(shè)計一個名為MutualUdpClient的解決方案,用來在系統(tǒng)內(nèi)共享UDP通訊聯(lián)機(jī)并且共享遠(yuǎn)程設(shè)備傳送的數(shù)據(jù)封包。

 

在MutualUdpClient這個解決方案中,套用先前部落格中所發(fā)表的Singleton Pool模式,套用這個模式讓系統(tǒng)能夠共享UdpClient聯(lián)機(jī),并且在有系統(tǒng)對象使用UdpClient聯(lián)機(jī)時就開啟共享UDP通訊聯(lián)機(jī),而在所有系統(tǒng)對象都不需要使用UdpClient聯(lián)機(jī)才真正去關(guān)閉這個共享的UDP通訊聯(lián)機(jī)。

 

套用Singleton Pool模式解決了共享UdpClient聯(lián)機(jī)的功能,接著在MutualUdpClient這個解決方案中,為了共享遠(yuǎn)程設(shè)備傳送的數(shù)據(jù)封包,在UdpClient與MutualUdpClient之間加入了一個RouteUdpClient對象。

 

RouteUdpClient對象是一個主動式的對象,在被建立之后會開啟一條獨立的線程,不斷的接收UdpClient所接收到的數(shù)據(jù)封包,并且將接收到數(shù)據(jù)封包透過事件的方式通知每個MutualUdpClient,經(jīng)由這樣的流程就可以將遠(yuǎn)程設(shè)備所傳送的數(shù)據(jù)封包,在每個MutualUdpClient之間共享。

 

而MutualUdpClient對象在收到RouteUdpClient所提供的數(shù)據(jù)封包時,會先將數(shù)據(jù)封包暫存在一個隊列里,并且在MutualUdpClient對象的Receive方法被呼叫時,再從隊列取出數(shù)據(jù)封包并且回傳給呼叫端,用以將遠(yuǎn)程設(shè)備傳送的數(shù)據(jù)封包提供給呼叫端做后續(xù)的處理。經(jīng)由這樣的方式,每個系統(tǒng)中所建立的MutualUdpClient對象就可以透過Receive方法取得,每個遠(yuǎn)程設(shè)備傳送的數(shù)據(jù)封包。

 

*這邊要特別一提的是,MutualUdpClient對象不選擇事件方式來提供數(shù)據(jù)封包而采用Receive方法來提供,是為了讓使用MutualUdpClient對象的開發(fā)人員,在使用對象的時候,能夠得到與使用UdpClient一樣的開發(fā)體驗,用以減少開發(fā)時的學(xué)習(xí)時間。

 

 

處理完共享UdpClient聯(lián)機(jī)、共享遠(yuǎn)程設(shè)備傳送的資料封包之后,還要處理一下傳送數(shù)據(jù)封包到遠(yuǎn)程設(shè)備的功能。在MutualUdpClient之中,對于傳送數(shù)據(jù)封包到遠(yuǎn)程設(shè)備并沒有特殊需求,所以直接使用UdpClient的Send功能就可以完成將數(shù)據(jù)封包傳送到遠(yuǎn)程設(shè)備的功能。

復(fù)制代碼 代碼如下:

class Program
{
    static void Main(string[] args)
    {
        // Receiver
        MutualUdpClient udpClientA = new MutualUdpClient(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1234));

        MutualUdpClient udpClientB = new MutualUdpClient(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1234));

        // Transmiter
        UdpClient transmiter = new UdpClient(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9999));

 
        // Send
        transmiter.Send(new byte[] { 55 }, 1, new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1234));

 
        // Receive
        byte[] packet = null;
        IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, IPEndPoint.MinPort);

        packet = udpClientA.Receive(ref remoteEndPoint);
        Console.WriteLine(string.Format("UdpClientA Receive:{0}", packet[0]));

        packet = udpClientB.Receive(ref remoteEndPoint);
        Console.WriteLine(string.Format("UdpClientB Receive:{0}", packet[0]));

        // End
        Console.ReadLine();

        // Close
        transmiter.Close();
        udpClientB.Close();
        udpClientA.Close();
    }
}

上列程序代碼示范如何在系統(tǒng)中使用MutualUdpClient對象,在范例中可以看到程序代碼中直接建立了兩個相同UDP端點的MutualUdpClient對象,并且可以正常的執(zhí)行不會出現(xiàn)SocketException的例外通知。而遠(yuǎn)程設(shè)備transmiter所傳送的數(shù)據(jù)封包,在被UdpClientA透過Receive方法接收之后,UdpClientB依然可以透過Receive方法接收同一個資料,這也就驗證了MutualUdpClient對象提供了共享通訊聯(lián)機(jī)、共享數(shù)據(jù)封包的功能。

 

原始碼下載: MutualUdpClientSample_jb51net.rar

標(biāo)簽:湖州 紅河 西寧 宣城 衢州 岳陽 西藏 福州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《.NET中應(yīng)用程序內(nèi)共享UdpClient聯(lián)機(jī)的實現(xiàn)方法》,本文關(guān)鍵詞  .NET,中,應(yīng)用程序,內(nèi),共享,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《.NET中應(yīng)用程序內(nèi)共享UdpClient聯(lián)機(jī)的實現(xiàn)方法》相關(guān)的同類信息!
  • 本頁收集關(guān)于.NET中應(yīng)用程序內(nèi)共享UdpClient聯(lián)機(jī)的實現(xiàn)方法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    国产麻豆精品免费密入口| 国产一区二区福利久久| 国产一级强片在线观看| 精品在线观看一区| 黄视频网站在线看| 国产亚洲免费观看| 欧美激情一区二区三区视频高清 | 欧美大片毛片aaa免费看| 午夜在线亚洲男人午在线| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 日韩一级黄色大片| 欧美a级v片不卡在线观看| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 午夜在线影院| 免费国产在线观看| 精品视频免费看| 国产视频一区二区三区四区| 台湾毛片| 日韩av东京社区男人的天堂| 97视频免费在线| 国产高清视频免费观看| 九九免费精品视频| 成人免费观看网欧美片| 天天做日日爱夜夜爽| 日本免费区| 亚洲www美色| 日韩欧美一及在线播放| 欧美激情一区二区三区在线播放| 亚洲 欧美 91| 久久久久久久免费视频| 日本特黄特黄aaaaa大片| 一级女性大黄生活片免费| 精品视频在线观看一区二区 | 日本免费看视频| 午夜欧美福利| 欧美另类videosbestsex| 九九精品久久久久久久久| 亚洲天堂免费| 91麻豆精品国产综合久久久| 色综合久久天天综合绕观看| 亚洲不卡一区二区三区在线 | 亚州视频一区二区| 中文字幕一区二区三区精彩视频 | 国产一区二区福利久久| 999精品在线| 黄视频网站免费| 一级女性大黄生活片免费| 日本特黄特色aaa大片免费| 黄色免费网站在线| 国产国产人免费视频成69堂| 亚洲天堂免费观看| 日本在线不卡视频| 亚洲女人国产香蕉久久精品 | 青青久热| 久久久久久久免费视频| 久久99中文字幕| 欧美国产日韩精品| 天天做人人爱夜夜爽2020| 日韩一级黄色| 在线观看导航| 久久精品人人做人人爽97| 999久久久免费精品国产牛牛| 国产精品1024永久免费视频 | 国产高清视频免费| 精品视频在线观看视频免费视频| 午夜精品国产自在现线拍| 二级特黄绝大片免费视频大片| 九九免费精品视频| 日本特黄特色aa大片免费| 欧美激情一区二区三区中文字幕| 国产成人啪精品视频免费软件| 四虎影视库国产精品一区| 精品国产一区二区三区国产馆| 日本伦理网站| 亚洲精品久久玖玖玖玖| 色综合久久久久综合体桃花网| 国产麻豆精品免费密入口| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 色综合久久天天综合观看| 精品视频在线观看一区二区 | 成人a级高清视频在线观看| 可以在线看黄的网站| 欧美激情一区二区三区在线| 亚洲女人国产香蕉久久精品| 亚洲精品久久久中文字| 国产成人欧美一区二区三区的| 韩国三级视频在线观看| 国产a网| 99色精品| 日韩中文字幕在线观看视频| 精品视频在线看 | 国产极品精频在线观看| 欧美a级大片| 精品久久久久久综合网| 精品国产亚一区二区三区| 欧美激情一区二区三区在线播放| a级黄色毛片免费播放视频| 免费国产在线观看| 国产91视频网| 国产伦精品一区二区三区在线观看| 日日日夜夜操| 久久精品欧美一区二区| 日韩免费片| 日本免费乱理伦片在线观看2018| 国产极品精频在线观看| 久久精品大片| 国产综合成人观看在线| 人人干人人草| 日韩在线观看免费| 九九热精品免费观看| 成人免费网站久久久| 高清一级做a爱过程不卡视频| 国产一区免费观看| 国产成a人片在线观看视频| 国产高清在线精品一区二区 | 成人a大片高清在线观看| 欧美日本免费| 国产一区精品| 一级片片| 97视频免费在线| 免费国产在线观看| 99久久精品国产国产毛片| 成人免费一级纶理片| 国产激情视频在线观看| 国产一区免费观看| 99热精品在线| 亚洲天堂免费| 欧美另类videosbestsex| 青青久久精品| 国产成a人片在线观看视频| 可以免费看污视频的网站| 国产a网| 天天做日日干| 精品久久久久久综合网| 午夜激情视频在线观看| 精品国产一区二区三区久久久蜜臀| 可以在线看黄的网站| 超级乱淫黄漫画免费| 你懂的在线观看视频| 亚洲第一视频在线播放| 91麻豆精品国产综合久久久| 九九久久99综合一区二区| 高清一级片| 毛片高清| 欧美a级大片| 台湾美女古装一级毛片| 中文字幕一区二区三区精彩视频 | 精品视频在线观看一区二区| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 国产福利免费视频| 欧美一区二区三区性| 99久久精品国产高清一区二区| 一级女性全黄生活片免费| 国产一区二区福利久久| 亚洲第一视频在线播放| 九九精品影院| 香蕉视频三级| 成人免费观看的视频黄页| 久草免费在线观看| 欧美一区二区三区性| 四虎久久精品国产| 尤物视频网站在线观看| 成人a大片高清在线观看| 色综合久久天天综线观看| 韩国三级视频在线观看| 欧美a级成人淫片免费看| 美女被草网站| 日韩在线观看视频黄| 国产91视频网| 999久久久免费精品国产牛牛| 欧美激情一区二区三区在线| a级毛片免费观看网站| 一级毛片视频免费| 精品国产香蕉伊思人在线又爽又黄| 国产一区二区精品| 欧美日本免费| 一级女性大黄生活片免费| 久久福利影视| 精品国产三级a∨在线观看| 一级女人毛片人一女人| 久久国产精品自线拍免费| 久久成人性色生活片| 欧美激情一区二区三区视频 | 国产极品精频在线观看| 久久精品大片| 久草免费在线观看| 国产视频久久久| 黄色免费网站在线| 你懂的在线观看视频| 国产不卡福利| 成人影院久久久久久影院| 成人免费观看视频| 日韩中文字幕在线观看视频| 一级女性全黄生活片免费| 亚欧成人乱码一区二区| 精品视频在线观看免费| 精品国产亚洲人成在线| 久久国产精品只做精品| 精品在线视频播放| 亚洲女人国产香蕉久久精品|