本日稍花化了一点时刻,应用C#的Socket考证了UDP的通讯,为接下来专程应用UDP做个分布式的通讯仿真体系打下基本。尽人皆知,UDP 就是用户数据报协定,在互联网参考模子的第四层——传输层。与TCP协定同层,都是供应信息的传输效劳,但与TCP最大区分就是,它是一种无衔接不牢靠的信息传输。
什么是无衔接不牢靠?直白点讲就是,发送数据的时刻,直接把UDP包往收集一扔就完事了,接不吸收收到发送的就不理了;吸收数据的时刻,有发给当地的UDP包就照单全收,收完再看是谁发的。比拟TCP,少了握手竖立衔接,保护衔接,衔接开释等一系列历程,因而具有很小的资本斲丧和处置惩罚速度快的长处。
好了说了一堆空话,最先讲怎样应用C#中Socket举行UDP通讯。TCP、UDP应用顺序能够经由过程TCPClient、TCPListener 和 UDPClient 类举行编程,而这些协定类也竖立在System.Net.Sockets.Socket 类的基本上,并无需剖析数据传送的细节。但为了更好地明白Socket编程,这里照样应用了Socket类举行UDP通讯编程。
UDP应用上已无严厉意义上的真正的效劳器和客户端之分了,端点之间都是同等的关联,因而举行通讯只需编写一个顺序即可。
下面给出症结部份代码与申明:
症结的全局变量
private IPEndPoint ipLocalPoint; private EndPoint RemotePoint; private Socket mySocket; private bool RunningFlag = false;
猎取当地IP的要领
private string getIPAddress() { // 取得本机局域网IP地点 IPAddress[] AddressList = Dns.GetHostByName(Dns.GetHostName()).AddressList; if (AddressList.Length < 1) { return ""; } return AddressList[0].ToString(); }
IP与端口号有用考证
private int getValidPort(string port) { int lport; //测试端口号是不是有用 try { //是不是为空 if (port == "") { throw new ArgumentException( "端口号无效,不能启动DUP"); } lport = System.Convert.ToInt32(port); } catch (Exception e) { //ArgumentException, //FormatException, //OverflowException Console.WriteLine("无效的端口号:" + e.ToString()); this.tbMsg.AppendText("无效的端口号:" + e.ToString() + "\n"); return -1; } return lport; } private IPAddress getValidIP(string ip) { IPAddress lip = null; //测试IP是不是有用 try { //是不是为空 if (!IPAddress.TryParse(ip, out lip)) { throw new ArgumentException( "IP无效,不能启动DUP"); } } catch (Exception e) { //ArgumentException, //FormatException, //OverflowException Console.WriteLine("无效的IP:" + e.ToString()); this.tbMsg.AppendText("无效的IP:" + e.ToString() + "\n"); return null; } return lip; }
Socket的设置
//获得本机IP,设置UDP端口号 ip = getValidIP(tbLocalIP.Text); port = getValidPort(tbLocalPort.Text); ipLocalPoint = new IPEndPoint(ip, port); //定义收集范例,数据衔接范例和收集协定UDP mySocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); //绑定收集地点 mySocket.Bind(ipLocalPoint); //获得客户机IP ip = getValidIP(tbRemoteIP.Text); port = getValidPort(tbRemotePort.Text); IPEndPoint ipep = new IPEndPoint(ip, port); RemotePoint = (EndPoint)(ipep); //启动一个新的线程,实行要领this.ReceiveHandle, //以便在一个自力的历程中实行数据吸收的操纵 RunningFlag = true; Thread thread = new Thread(new ThreadStart(this.ReceiveHandle)); thread.Start();
吸收线程
//定义一个托付 public delegate void MyInvoke(string strRecv); private void ReceiveHandle() { //吸收数据处置惩罚线程 string msg; byte[] data=new byte[1024]; MyInvoke myI = new MyInvoke(UpdateMsgTextBox); while (RunningFlag) { if (mySocket == null || mySocket.Available < 1) { Thread.Sleep(200); continue; } //跨线程挪用控件 //吸收UDP数据报,援用参数RemotePoint取得源地点 int rlen = mySocket.ReceiveFrom(data, ref RemotePoint); msg = Encoding.Default.GetString(data, 0, rlen); tbMsg.BeginInvoke(myI, new object[]{RemotePoint.ToString() + " : " + msg}); } } private void btSend_Click(object sender, EventArgs e) { string msg; msg = tbSendMsg.Text; //发送UDP数据包 byte[] data = Encoding.Default.GetBytes(msg); mySocket.SendTo(data, data.Length, SocketFlags.None, RemotePoint); } private void UpdateMsgTextBox(string msg) { //吸收数据显现 this.tbMsg.AppendText( msg + "\n"); }
以上只需设置好当地和长途的IP和端口号,很轻易就完成了UDP的双向通讯。虽然说UDP数据包不能保证牢靠传输,收集忙碌、堵塞等要素,都有能够阻挠数据包抵达指定的目的地。但经由测试,其通讯还蛮牢靠的,别忘了QQ也是应用UDP举行立即通讯的。
以上就是C#的Socket完成UDP协定通讯的示例代码详解的细致内容,更多请关注ki4网别的相干文章!