亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

基于C#的UDP協議的同步通信實現代碼

2019-10-29 21:14:24
字體:
來源:轉載
供稿:網友

一、摘要

總結基于C#的UDP協議的同步通信。

 二、實驗平臺

Visual Studio 2010

 三、實驗原理

UDP傳輸協議同TCP傳輸協議的區別可查閱相關文檔,此處不再贅述。 

四、實例

4.1 采用socket實現UDP

由于UDP是一種無連接的協議。因此,為了使服務器應用能夠發送和接收UDP數據包,則需要做兩件事情:

(1) 創建一個Socket對象;

(2) 將創建的套接字對象與本地IPEndPoint進行綁定。

完成上述步驟后,那么創建的套接字就能夠在IPEndPoint上接收流入的UDP數據包,或者將流出的UDP數據包發送到網絡中其他任意設備。使用UDP進行通信時,不需要連接。因為異地的主機之間沒有建立連接,所以UDP不能使用標準的Send()和Receive()t套接字方法,而是使用兩個其他的方法:SendTo()和ReceiveFrom()。

SendTo()方法指定要發送的數據,和目標機器的IPEndPoint。該方法有多種不同的使用方法,可以根據具體的應用進行選擇,但是至少要指定數據包和目標機器。如下:

SendTo(byte[] data,EndPoint Remote)

ReceiveFrom()方法同SendTo()方法類似,但是使用EndPoint對象聲明的方式不一樣。利用ref修飾,傳遞的不是一個EndPoint對象,而是將參數傳遞給一個EndPoint對象。

UDP應用不是嚴格意義上的真正的服務器和客戶機,而是平等的關系,即沒有主與次的關系。為了簡便起見,仍然把下面的這個應用叫做UDP服務器。

服務器端代碼:

using System;using System.Collections.Generic;using System.Text;using System.Net;using System.Net.Sockets;namespace UDP{ class Program {  static void Main(string[] args)  {   int recv;   byte[] data = new byte[1024];   //得到本機IP,設置TCP端口號      IPEndPoint ip = new IPEndPoint(IPAddress.Any, 8001);   Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);   //綁定網絡地址   newsock.Bind(ip);   Console.WriteLine("This is a Server, host name is {0}", Dns.GetHostName());   //等待客戶機連接   Console.WriteLine("Waiting for a client");   //得到客戶機IP   IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);   EndPoint Remote = (EndPoint)(sender);   recv = newsock.ReceiveFrom(data, ref Remote);   Console.WriteLine("Message received from {0}: ", Remote.ToString());   Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));   //客戶機連接成功后,發送信息   string welcome = "你好 ! ";   //字符串與字節數組相互轉換   data = Encoding.ASCII.GetBytes(welcome);   //發送信息   newsock.SendTo(data, data.Length, SocketFlags.None, Remote);   while (true)   {    data = new byte[1024];    //發送接收信息    recv = newsock.ReceiveFrom(data, ref Remote);    Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));    newsock.SendTo(data, recv, SocketFlags.None, Remote);   }  } }}

對于接收流入的UDP服務器程序來說,必須將程序與本地系統中指定的UDP端口進行綁定。這就可以通過使用合適的本地IP地址創建一個IPEndPoint對象,以及合適的UDP端口號。上述范例程序中的UDP服務器能夠在端口8001從網絡上接收任意流入的UDP數據包。

UDP客戶機程序與服務器程序非常類似。

因為客戶機不需要在指定的UDP端口等待流入的數據,因此,不使用Bind()方法,而是使用在數據發送時系統隨機指定的一個UDP端口,而且使用同一個端口接收返回的消息。在開發產品時,要為客戶機指定一套UDP端口,以便服務器和客戶機程序使用相同的端口號。UDP客戶機程序首先定義一個IPEndPoint,UDP服務器將發送數據包到這個IPEndPoint。如果在遠程設備上運行UDP服務器程序,在IPEndPoint定義中必須輸入適當的IP地址和UDP端口號信息。

客戶端代碼:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Net;using System.Net.Sockets;namespace UDPClient{ class Program {  static void Main(string[] args)  {   byte[] data = new byte[1024];   string input, stringData;   //構建TCP 服務器   Console.WriteLine("This is a Client, host name is {0}", Dns.GetHostName());   //設置服務IP,設置TCP端口號   IPEndPoint ip = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8001);   //定義網絡類型,數據連接類型和網絡協議UDP   Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);   string welcome = "你好! ";   data = Encoding.ASCII.GetBytes(welcome);   server.SendTo(data, data.Length, SocketFlags.None, ip);   IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);   EndPoint Remote = (EndPoint)sender;   data = new byte[1024];   //對于不存在的IP地址,加入此行代碼后,可以在指定時間內解除阻塞模式限制   int recv = server.ReceiveFrom(data, ref Remote);   Console.WriteLine("Message received from {0}: ", Remote.ToString());   Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));   while (true)   {    input = Console.ReadLine();    if (input == "exit")     break;    server.SendTo(Encoding.ASCII.GetBytes(input), Remote);    data = new byte[1024];    recv = server.ReceiveFrom(data, ref Remote);    stringData = Encoding.ASCII.GetString(data, 0, recv);    Console.WriteLine(stringData);   }   Console.WriteLine("Stopping Client.");   server.Close();  } }}

上述代碼的實現邏輯為:相關設置完成后,服務器端先向客戶端發送信息,之后客戶端通過鍵盤發送字符串,服務器端收到后再發送給客戶端,如此循環。

4.2 采用UDPClient類實現

服務器端代碼:

using System;using System.Net;using System.Net.Sockets;using System.Text;public class Custom{ // 設置IP,IPV6 private static readonly IPAddress GroupAddress = IPAddress.Parse("IP地址"); // 設置端口 private const int GroupPort = 11000; private static void StartListener() {  bool done = false;  UdpClient listener = new UdpClient();  IPEndPoint groupEP = new IPEndPoint(GroupAddress, GroupPort);  try  {   //IPV6,組播   listener.JoinMulticastGroup(GroupAddress);   listener.Connect(groupEP);   while (!done)   {    Console.WriteLine("Waiting for broadcast");    byte[] bytes = listener.Receive(ref groupEP);    Console.WriteLine("Received broadcast from {0} :/n {1}/n", groupEP.ToString(), Encoding.ASCII.GetString(bytes, 0, bytes.Length));   }   listener.Close();  }  catch (Exception e)  {   Console.WriteLine(e.ToString());  } } public static int Main(String[] args) {  StartListener();  return 0; }}

客戶端代碼:

using System;using System.Net;using System.Net.Sockets;using System.Text;public class Client{ private static IPAddress GroupAddress = IPAddress.Parse("IP地址"); private static int GroupPort = 11000; private static void Send(String message) {  UdpClient sender = new UdpClient();  IPEndPoint groupEP = new IPEndPoint(GroupAddress, GroupPort);  try  {   Console.WriteLine("Sending datagram : {0}", message);   byte[] bytes = Encoding.ASCII.GetBytes(message);   sender.Send(bytes, bytes.Length, groupEP);   sender.Close();  }  catch (Exception e)  {   Console.WriteLine(e.ToString());  } } public static int Main(String[] args) {  Send(args[0]);  return 0; }}

以上代碼需要說明的是:

(1) 上述代碼是基于IPV6地址的組播模式。IPv4中的廣播(broadcast)可以導致網絡性能的下降甚至廣播風暴(broadcast storm)。在IPv6中就不存在廣播這一概念了,取而代之的是組播(multicast)和任意播(anycast)。

(2) IPV6地址表示方法:

a) X:X:X:X:X:X:X:X(每個X代表16位的16進制數字),不區分大小寫;

b) 排頭的0可省略,比如09C0就可以寫成9C0,0000可以寫成0;

c) 連續為0的字段可以以::來代替,但是整個地址中::只能出現一次,比如FF01:0:0:0:0:0:0:1就可以簡寫成FF01::1。

(3) 如果是采用窗體的形式建議使用這種格式,否則在接收數據時可能會出現死機的現象。

// 創建一個子線程   Thread thread = new Thread(    delegate()    {     try     {      //在這里寫你的代碼     }     catch (Exception )     {     }    }   );   thread.Start();

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美老少配视频| 狠狠色狠狠色综合日日小说| 欧美成人精品一区二区| 2019中文字幕全在线观看| 国产98色在线| 亚洲人成在线观看网站高清| 97av在线播放| 91亚洲国产成人精品性色| 91精品久久久久| 黑人巨大精品欧美一区二区一视频| 97婷婷涩涩精品一区| 国产精品日韩在线一区| 日韩在线观看免费高清完整版| 这里只有视频精品| 午夜精品99久久免费| 国产噜噜噜噜噜久久久久久久久| 国产精品高潮视频| 欧美在线xxx| 久久久999精品| 成人欧美一区二区三区在线| 亚洲va码欧洲m码| 国产精品在线看| 欧美精品aaa| 国产精品女主播视频| 久久精品国产成人精品| 国模极品一区二区三区| 日韩理论片久久| 日韩精品在线视频| 亚洲情综合五月天| 中文字幕自拍vr一区二区三区| 国产精品免费在线免费| 国语自产精品视频在线看一大j8| 国产精品美女久久久久av超清| 久久精品精品电影网| 久久伊人91精品综合网站| 欧美激情视频播放| 国产丝袜一区二区三区免费视频| 国产精品情侣自拍| 欧美精品久久久久a| 亚洲欧洲中文天堂| 久久99精品久久久久久琪琪| 欧美激情第1页| 午夜欧美不卡精品aaaaa| 久久成人亚洲精品| 精品国产91久久久| 亚洲人成网站色ww在线| 国产成人亚洲综合91| 欧美性videos高清精品| 亚洲欧美日韩国产中文| 日韩h在线观看| 亚洲视频欧美视频| yellow中文字幕久久| 欧美天天综合色影久久精品| 国产视频在线观看一区二区| 亚洲香蕉在线观看| 国产美女主播一区| 亚洲一区二区三区在线视频| 午夜精品一区二区三区在线视频| 亚洲福利在线观看| 久久久久国色av免费观看性色| 日韩国产一区三区| 色综合久综合久久综合久鬼88| 91国语精品自产拍在线观看性色| 久久久久久香蕉网| 国产精品v日韩精品| 亚洲一级一级97网| 在线观看国产精品日韩av| 亚洲午夜性刺激影院| 中文一区二区视频| 精品国产一区av| 欧美另类老肥妇| 久久久亚洲国产| 亚洲午夜色婷婷在线| 欧美中文字幕在线播放| 国产激情999| 欧美性猛交xxxx| 日韩成人网免费视频| 亚洲国产精品女人久久久| 欧美日韩国产va另类| 国产精品高潮呻吟久久av野狼| 亚洲午夜未删减在线观看| 久久久久久久久久久网站| 亚洲国产成人精品久久| 亚洲自拍中文字幕| 日av在线播放中文不卡| 欧美一级淫片播放口| 97在线精品国自产拍中文| 富二代精品短视频| 日韩欧美成人免费视频| 亚洲精品国精品久久99热| 欧美精品在线观看| 日韩免费av一区二区| 亚洲精品国产精品乱码不99按摩| 尤物九九久久国产精品的分类| 国产中文日韩欧美| 97视频在线观看免费| 久久久久久97| 国产欧美中文字幕| 欧美xxxx做受欧美.88| 国产午夜精品麻豆| 久久久久久久亚洲精品| 91精品国产高清自在线看超| 91在线免费网站| 色偷偷噜噜噜亚洲男人的天堂| 欧美成人精品在线视频| 精品国产福利视频| 中文字幕日韩在线播放| 精品亚洲永久免费精品| 日韩精品视频观看| 亚洲午夜小视频| 最近2019年手机中文字幕| 色综合天天狠天天透天天伊人| 人人澡人人澡人人看欧美| 色播久久人人爽人人爽人人片视av| 欧美成人四级hd版| 亚洲国产美女久久久久| 日韩精品视频在线观看网址| 亚洲国产又黄又爽女人高潮的| 精品久久香蕉国产线看观看gif| 国产精品久久久久久久久久99| 精品成人69xx.xyz| 97久久超碰福利国产精品…| 91精品久久久久久久久久久久久久| 精品国产电影一区| 日本精品性网站在线观看| 中文字幕日韩有码| 超碰精品一区二区三区乱码| 日韩成人av网| 国产精品男女猛烈高潮激情| 97在线观看免费| 国产精品美女在线观看| 国产精品成熟老女人| 亚洲自拍中文字幕| 精品久久中文字幕| 亚洲国产精久久久久久久| 欧洲美女7788成人免费视频| 清纯唯美亚洲激情| 国产精品三级久久久久久电影| 精品一区二区三区电影| 午夜精品福利电影| 青青a在线精品免费观看| 久久久国产一区二区三区| 成人中文字幕+乱码+中文字幕| 亚洲欧美国产视频| 北条麻妃一区二区在线观看| 日韩美女在线看| 中文字幕精品在线视频| 亚洲欧洲日本专区| 亚洲第一区在线| 北条麻妃99精品青青久久| 国产精品久久久久久av福利软件| 97超碰国产精品女人人人爽| 亚洲综合中文字幕在线观看| 亚洲欧美国产精品va在线观看| 欧美激情综合亚洲一二区| 国产午夜精品美女视频明星a级| 麻豆国产精品va在线观看不卡| 欧美人与性动交| 2019中文字幕在线| 日韩av在线一区| 丝袜情趣国产精品| 欧美性猛交丰臀xxxxx网站| 久久久久北条麻妃免费看| 欧美精品videosex极品1|