C# 基於 UDP-Socket 的 UdpClient 使用方法
C# 基於 UDP-Socket 的 UdpClient 使用方法
資料來源: https://lolikitty.pixnet.net/blog/post/109168079
這邊主要的重點是 UdpClient 這個類別,雖然從字面上這個類別叫做 UDP 的 Client (客戶端),但實際上我們也可以用它來建立伺服器,簡單來說 UdpClient 類別可以同時建立 伺服器端 (Server) 與 客戶端 (Client) 兩種功能
客戶端:
using System; using System.Net; using System.Net.Sockets; class MainClass { public static void Main (string[] args) { Console.WriteLine ("這是客戶端...\n"); IPEndPoint ipep = new IPEndPoint (IPAddress.Parse ("127.0.0.1"), 5555); UdpClient uc = new UdpClient (); for (int i = 0; i<10; i++) { byte[] b = System.Text.Encoding.UTF8.GetBytes ("這是'客戶端'傳送的訊息 ~ " + i); uc.Send (b, b.Length, ipep); Console.WriteLine (System.Text.Encoding.UTF8.GetString (uc.Receive (ref ipep))); } } }
伺服器端:
using System; using System.Net; using System.Net.Sockets; class Program { static void Main(string[] args) { Console.WriteLine("這是伺服器...\n"); IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 5555); UdpClient uc = new UdpClient(ipep.Port); int i = 0; while (true) { Console.WriteLine(System.Text.Encoding.UTF8.GetString(uc.Receive(ref ipep))); byte[] b = System.Text.Encoding.UTF8.GetBytes("這是'伺服器'回傳的訊息 ~ " + i++); uc.Send(b, b.Length, ipep); } } }
One thought on “C# 基於 UDP-Socket 的 UdpClient 使用方法”
Socket UDP 伺服器/客戶端 製作
https://dotblogs.com.tw/naisu/2016/03/09/socket_udp
Server端 ~ 完整程式碼
IPEndPoint IPEnd = new IPEndPoint(IPAddress.Any, 5555); //定義好伺服器port
Socket Server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); //傳輸模式為UDP
Server.Bind(IPEnd); //綁定ip和port
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); //定義空位址 給接收的存放(唯讀)
EndPoint Remote = (EndPoint)sender; //宣告可以存放IP位址的用 EndPoint
byte[] getdata = new byte[1024]; //要接收的封包大小
while (true)
{
int recv = Server.ReceiveFrom(getdata, ref Remote); //把接收的封包放進getdata且傳回大小存入recv , ReceiveFrom(收到的資料,來自哪個IP放進Remote) 不能放IPEndPoint 因為唯獨
string input = Encoding.UTF8.GetString(getdata, 0, recv); //把接收的byte資料轉回string型態
Console.WriteLine("客戶來自 " + "[" + Remote.ToString() + "] : " + input); //將收到的顯示
Server.SendTo(getdata, recv, SocketFlags.None, Remote); //將原資料送回去
}
client端 ~ 完整程式碼
IPEndPoint remoteIP = new IPEndPoint(IPAddress.Parse("172.11.11.11"), 5555); //定義一個位址 (伺服器位址)
Socket Client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); //傳輸模式為UDP
while (true) //持續給使用者輸入訊息以及持續監聽,接收伺服器回傳訊息
{
string input = Console.ReadLine(); //可以輸入訊息
Client.SendTo(Encoding.UTF8.GetBytes(input), remoteIP); //(寄什麼訊息,對象的IP位址)寄出前先編碼成byte資料格式
byte[] data = new byte[4096]; //存放接收的資料
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); //定一個空端點(唯讀)
EndPoint Remote = (EndPoint)sender; //不會解釋.. 宣告可以存放IP位址的用 EndPoint
int recv = Client.ReceiveFrom(data, ref Remote); //(收到的資料,來自哪個IP放進Remote) 不能放IPEndPoint 好像是它唯獨的關係 這時候sender已經變成跟remoteIP一樣
Console.WriteLine("伺服器來自 " + "[" + Remote.ToString() + "] : " + Encoding.UTF8.GetString(data, 0, recv)); //顯示資料前也要編碼一次 轉換回string資料格式
}