基於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協議_服務器端 {
class Program
{
private static Socket udpServer;
static void Main(string[] args) {
//1,創建socket
udpServer = new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
//2,綁定ip跟端口號
udpServer.Bind( new IPEndPoint( IPAddress.Parse("192.168.1.101"),7788 ) );
//3,接收數據
new Thread(ReceiveMessage){ IsBackground = true}.Start();
Console.WriteLine("服務器啟動...");
Console.ReadKey();
}
static void ReceiveMessage()
{
while (true)
{
EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
byte[] data = new byte[1024];
int length = udpServer.ReceiveFrom(data, ref remoteEndPoint);//這個方法會把數據的來源(ip:port)放到第二個參數上
string message = Encoding.UTF8.GetString(data, 0, length);
Console.WriteLine("從ip:" + (remoteEndPoint as IPEndPoint).Address.ToString() + ":" + (remoteEndPoint as IPEndPoint).Port + "收到了數據:" + message);
}
}
}
}
客戶端:
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協議_客戶端 {
class Program {
static void Main(string[] args) {
//創建socket
Socket udpClient = new Socket(AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp);
while (true)
{
//發送數據
EndPoint serverPoint = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 7788);
string message = Console.ReadLine();
byte[] data = Encoding.UTF8.GetBytes(message);
udpClient.SendTo(data, serverPoint);
}
udpClient.Close();
Console.ReadKey();
}
}
}
執行過程:
(1)啟動服務器
(2)啟動客戶端,並向服務器發送數據