C# 基於 UDP-Socket 的 UdpClient 使用方法

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 使用方法

  1. 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資料格式
    }

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *