C#怎么使用udp实现消息的接收和发送
导读:本文共3808字符,通常情况下阅读需要13分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: 使用udp实现消息的接收和发送代码比较简单,但是别忘记关闭防火墙进行测试。首先便是服务端,使用Socket进行实现,参考代码如下:privatestaticSocketudpServer;staticvoidstartUdpReceive(){Console.WriteLine("------startUdpReceive--");u... ...
目录
(为您整理了一些要点),点击可以直达。使用udp实现消息的接收和发送
代码比较简单,但是别忘记关闭防火墙进行测试。
首先便是服务端,使用Socket进行实现,参考代码如下:
privatestaticSocketudpServer;staticvoidstartUdpReceive(){Console.WriteLine("------startUdpReceive--");udpServer=newSocket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);udpServer.Bind(newIPEndPoint(IPAddress.Parse("192.168.2.106"),10023));newThread(ReceiveMessage){IsBackground=true}.Start();}privatestaticvoidReceiveMessage(){Console.WriteLine("------ReceiveMessage--");while(true){byte[]data=newbyte[1024];EndPointendPoint=newIPEndPoint(IPAddress.Any,0);intcount=udpServer.ReceiveFrom(data,refendPoint);if(count>0){stringmessage=Encoding.UTF8.GetString(data,0,count);Console.WriteLine("-----从ip"+(endPointasIPEndPoint).Address.ToString()+":"+(endPointasIPEndPoint).Port+"Get"+message);}}}
在绑定socket端口的时候,需要提供绑定的ip和端口号,如这里是
udpServer.Bind(newIPEndPoint(IPAddress.Parse("192.168.2.106"),10023));
本机ip是是192.168.2.106,绑定端口是10023。然后使用while循环监听消息。对于本机来说,也可以使用 udpServer.Bind(new IPEndPoint(IPAddress.Any, 10023)); 只绑定端口,对于ip则不限制。
也可以不用Socket而是直接使用UdpClient类来写接收端,效果类似:
staticUdpClientudpcRecv;publicstaticvoidUdpServices(){try{IPAddressip=IPAddress.Parse("192.168.2.106");IPEndPointremoteIpep=newIPEndPoint(ip,10023);udpcRecv=newUdpClient(remoteIpep);ThreadthrRecv=newThread(ReceiveMessage22);thrRecv.IsBackground=true;thrRecv.Start();}catch(Exceptionex){MessageBox.Show("错误","请检查网络");}}privatestaticvoidReceiveMessage22(){IPEndPointremoteIpep=newIPEndPoint(IPAddress.Any,0);Console.WriteLine("-----remoteIpep:"+remoteIpep.Address+":"+remoteIpep.Port);while(true){try{byte[]bytRecv=udpcRecv.Receive(refremoteIpep);stringmessage=Encoding.UTF8.GetString(bytRecv,0,bytRecv.Length);Console.WriteLine("-----reveicemessage:"+message);}catch(Exceptionex){MessageBox.Show("UDP异常",ex.Message);}}}
接下来是发送端:
UdpClientudpClient=newUdpClient();try{udpClient.Connect("192.168.2.106",10023);Byte[]sendBytes=Encoding.ASCII.GetBytes("Isanybodythere??????");udpClient.Send(sendBytes,sendBytes.Length);}catch(Exceptionex){Console.WriteLine(ex.ToString());}
如果代码爆红则应该是导包的问题,加入以下即可。
usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;usingSystem.Net.Sockets;usingSystem.Net;usingSystem.Net.NetworkInformation;usingSystem.Management;usingSystem.Threading;
上面都写好后可以测试了,但是我却遇到了问题,后面才知道是电脑端防火墙没开导致,所以和电脑端调试网络通信的时候,需要关闭防火墙,才能收到数据。
C# 运用UDP
面试的时候偶尔会问到UDP和TCP的一个区别。
TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。举例:打电话,需要双方都接通,才能进行对话。特点:效率低,数据传输比较安全。
UDP是一种面向无连接的传输层通信协议。举例:发短信,不需要双方建立连接,但是,数据报的大小应限制在64k以内。特点:效率高,数据传输不安全,容易丢包
然后发现在网上查找关于C#运行UDP的实例,确实不好找,杂乱无章。痛定思痛!
进行一个简单的发送和接收测试。
目前,UDP本人亲自用过的场景,客户端和服务端需要进行数据传输,但是服务端,在开始时是连接的别的网络,切换过来之后,并不能知道当前的一个具体的IP地址。但是客户端的IP地址是固定的,此种场景下,服务端网络切换过来之后,建立UDP服务端,像指定的客户端(IP地址和端口号)发送数据,即可知道当前服务端的ip地址。
服务端界面
usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Net;usingSystem.Net.Sockets;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;namespaceMyTest.UDP{publicpartialclassUDP_Sever:Form{IPEndPointremotePoint;UdpClientsever=null;publicUDP_Sever(){InitializeComponent();}privatevoidbutton1_Click(objectsender,EventArgse){IPAddressremoteIP=IPAddress.Parse(textBox1.Text.Trim());//假设发送给这个IPintremotePort=int.Parse(textBox2.Text.Trim());remotePoint=newIPEndPoint(remoteIP,remotePort);//实例化一个远程端点sever=newUdpClient();}privatevoidbutton2_Click(objectsender,EventArgse){if(!string.IsNullOrWhiteSpace(textBox3.Text.Trim())){stringsendString=textBox3.Text.Trim();//要发送的字符串byte[]sendData=Encoding.Default.GetBytes(sendString);//要发送的字节数组sever.Send(sendData,sendData.Length,remotePoint);//将数据发送到远程端点textBox3.Text="";}}privatevoidUDP_Sever_FormClosing(objectsender,FormClosingEventArgse){sever.Close();}}}
客户端界面
usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Net;usingSystem.Net.Sockets;usingSystem.Text;usingSystem.Threading;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;namespaceMyTest.UDP{publicpartialclassUDP_Client:Form{UdpClientclient=null;IPEndPointremotePoint;stringreceiveString=null;byte[]receiveData=null;publicUDP_Client(){InitializeComponent();CheckForIllegalCrossThreadCalls=false;}privatevoidbutton1_Click(objectsender,EventArgse){//实例化一个远程端点,IP和端口可以随意指定,等调用client.Receive(refremotePoint)时会将该端点改成真正发送端端点remotePoint=newIPEndPoint(IPAddress.Any,0);client=newUdpClient(int.Parse(textBox2.Text.Trim()));Threadthread=newThread(Revice);thread.IsBackground=true;thread.Start();}privatevoidRevice(){while(true){receiveData=client.Receive(refremotePoint);//接收数据receiveString=Encoding.Default.GetString(receiveData);listBox1.Items.Add(remotePoint.Address.ToString()+":"+receiveString);}}}}
</div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
C#怎么使用udp实现消息的接收和发送的详细内容,希望对您有所帮助,信息来源于网络。