c#基于socket的UDP服务器和客户端实例
基于Udp協議是無連接模式通訊,占用資源少,響應速度快,延時低。至于可靠性,可通過應用層的控制來滿足。(不可靠連接)
使用Udp協議通訊需要具備以下幾個條件:
(1).建立一個套接字(Socket)
(2).綁定服務器端IP地址及端口號--服務器端
(3).通過SendTo()方法向指定主機發送消息 (需提供主機IP地址及端口)
(4).通過ReciveFrom()方法接收指定主機發送的消息 (需提供主機IP地址及端口)
?
下面用代碼實現簡單的服務器---客戶端通信
服務器端:
| using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Threading.Tasks; namespace _023_socket編程_UDP協議_服務器端 { //3,接收數據 static void ReceiveMessage() } |
客戶端:
| using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; namespace _002_socket編程_udp協議_客戶端 { while (true)
|
執行過程:
(1)啟動服務器
(2)啟動客戶端,并向服務器發送數據
//***************************2*************
C#使用UDP實現服務器與客戶端通信
TCP 必須建立在連接才可以進行通信,
UDP不需要建立通信
但兩者都需要監聽來接收消息
服務端
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Net.Sockets; using System.Net; using System.Threading;namespace UDP_windows_服務器 {public partial class Form1 : Form{public Form1(){InitializeComponent();CheckForIllegalCrossThreadCalls = false;}/// <summary>/// 獲取本地IP/// </summary>private void label1_Click(object sender, EventArgs e){string ip = IPAddress.Any.ToString();textBox1.Text = ip;}Socket server;private void button1_Click(object sender, EventArgs e){//1.創建服務器端電話server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);//2.創建手機卡IPAddress iP = IPAddress.Parse(textBox1.Text);IPEndPoint endPoint = new IPEndPoint(iP, int.Parse(textBox2.Text));//3.將電話卡插進電話中(綁定端口號和IP)server.Bind(endPoint);listBox1.Items.Add("服務器已經成功開啟!");//開啟接收消息線程Thread t = new Thread(ReciveMsg);t.IsBackground = true;t.Start();}/// <summary>/// 向特定ip的主機的端口發送數據/// </summary>tevoid SendMsg(){//string hostName = Dns.GetHostName(); //獲取本機名//IPHostEntry localhost = Dns.GetHostEntry(hostName); //獲取IPv6地址//IPAddress localaddr = localhost.AddressList[0];EndPoint point = new IPEndPoint(IPAddress.Parse("127.0.0.1"), int.Parse(textBox2.Text));string msg = textBox3.Text;server.SendTo(Encoding.UTF8.GetBytes(msg), point);}/// <summary>/// 接收發送給本機ip對應端口號的數據/// </summary>void ReciveMsg(){while (true){EndPoint point = new IPEndPoint(IPAddress.Any, 0);//用來保存發送方的ip和端口號byte[] buffer = new byte[1024 * 1024];int length = server.ReceiveFrom(buffer, ref point);//接收數據報string message = Encoding.UTF8.GetString(buffer, 0, length);listBox1.Items.Add(point.ToString() + ":" + message);}}private void button2_Click(object sender, EventArgs e){if (textBox3.Text != ""){//開啟發送消息線程Thread t2 = new Thread(SendMsg);t2.Start();}}} }客戶端
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Net.Sockets; using System.Net; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Threading;namespace UDP_windows_客戶端 {public partial class Form1 : Form{public Form1(){InitializeComponent();}/// <summary>/// 創建客戶端/// </summary>Socket client;private void button1_Click(object sender, EventArgs e){///創建客戶端client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);IPAddress iP = IPAddress.Parse(textBox1.Text);///端口號IPEndPoint endPoint = new IPEndPoint(iP, int.Parse(textBox2.Text));///建立與服務器的遠程連接client.Connect(endPoint);///線程問題Thread thread = new Thread(ReciveMsg);thread.IsBackground = true;thread.Start(client);listBox1.Items.Add("客戶端已成功開啟!");}/// <summary>/// 向特定ip的主機的端口發送數據/// </summary>void SendMsg(){///獲取IP與端口號EndPoint point = new IPEndPoint(IPAddress.Parse(textBox1.Text), int.Parse(textBox2.Text));///發送內容string msg = textBox3.Text;///將數據發送到指定的ip的主機的端口client.SendTo(Encoding.UTF8.GetBytes(msg), point);}/// <summary>/// 接收發送給本機ip對應端口號的數據/// </summary>void ReciveMsg(object o){Socket client = o as Socket;while (true){try{///用來保存發送方的ip和端口號EndPoint point = new IPEndPoint(IPAddress.Any, 0);///定義客戶端接收到的信息大小byte[] buffer = new byte[1024 * 1024];///接收到的信息大小(所占字節數)int length = client.Receive(buffer);string message = Encoding.UTF8.GetString(buffer, 0, length);listBox1.Items.Add(point.ToString() + ":" + message);}catch (Exception){client.Close();}}}private void button2_Click(object sender, EventArgs e){if (textBox3.Text != ""){//開啟發送消息線程Thread t2 = new Thread(SendMsg);t2.Start();}listBox1.Items.Add(textBox3.Text);}private void Form1_Load(object sender, EventArgs e){}} }?
總結
以上是生活随笔為你收集整理的c#基于socket的UDP服务器和客户端实例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: springboot 项目输出 sql
- 下一篇: C# new和override的区别和用