給我一個 C# net8.0 Socket 的 client 端原始程式. /* 這個範例展示了如何使用非同步操作(async/await)與 .NET 8.0 中的 Socket API 進行網路通信。 記得將 serverIp 和 serverPort 設置為目標伺服器的 IP 地址和端口號,並確保伺服器端已準備好接收連線。 希望這對你有所幫助!如果還有其他需求或疑問,隨時告訴我。 */ 將範例程式改為由 main() 呼叫的函數. 以下是將程式改寫為由 Main() 呼叫其他函數的版本。這樣可以讓程式結構更加模組化和易於維護: using System.Net; using System.Net.Sockets; using System.Text; class Program { static async Task Main(string[] args) { string serverIp = "127.0.0.1"; // 請修改為目標伺服器的 IP 地址 int serverPort = 8080; // 請修改為目標伺服器的端口號 await RunClientAsync(serverIp, serverPort); } static async Task RunClientAsync(string serverIp, int serverPort) { try { using (Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) { await ConnectToServer(clientSocket, serverIp, serverPort); await SendMessage(clientSocket, "Hello, Server!"); await ReceiveResponse(clientSocket); } } catch (Exception ex) { Console.WriteLine($"發生錯誤: {ex.Message}"); } } static async Task ConnectToServer(Socket clientSocket, string serverIp, int serverPort) { await clientSocket.ConnectAsync(new IPEndPoint(IPAddress.Parse(serverIp), serverPort)); Console.WriteLine("已連接到伺服器"); } static async Task SendMessage(Socket clientSocket, string message) { byte[] messageBytes = Encoding.UTF8.GetBytes(message); await clientSocket.SendAsync(messageBytes, SocketFlags.None); Console.WriteLine($"已傳送訊息: {message}"); } static async Task ReceiveResponse(Socket clientSocket) { byte[] buffer = new byte[1024]; int receivedBytes = await clientSocket.ReceiveAsync(buffer, SocketFlags.None); string serverResponse = Encoding.UTF8.GetString(buffer, 0, receivedBytes); Console.WriteLine($"伺服器回應: {serverResponse}"); } } 給我一個 C# net8.0 Socket 的 Service 端原始程式模組, 可以由 Main() 呼叫. 以下是一個 C# 建立的 .NET 8.0 Socket 伺服端模組範例,具有模組化結構並由 Main() 呼叫: using System.Net; using System.Net.Sockets; using System.Text; class Program { static async Task Main(string[] args) { int port = 8080; // 伺服器監聽的端口號 await RunServerAsync(port); } static async Task RunServerAsync(int port) { try { using (Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) { serverSocket.Bind(new IPEndPoint(IPAddress.Any, port)); serverSocket.Listen(10); Console.WriteLine($"伺服器已啟動,正在監聽連接 (端口: {port})..."); while (true) { Socket clientSocket = await serverSocket.AcceptAsync(); _ = HandleClientAsync(clientSocket); // 處理客戶端連線 (非同步執行) } } } catch (Exception ex) { Console.WriteLine($"伺服器發生錯誤: {ex.Message}"); } } static async Task HandleClientAsync(Socket clientSocket) { try { Console.WriteLine("客戶端已連接"); // 接收客戶端訊息 byte[] buffer = new byte[1024]; int receivedBytes = await clientSocket.ReceiveAsync(buffer, SocketFlags.None); string clientMessage = Encoding.UTF8.GetString(buffer, 0, receivedBytes); Console.WriteLine($"收到客戶端訊息: {clientMessage}"); // 傳送回應訊息給客戶端 string response = "Hello, Client!"; byte[] responseBytes = Encoding.UTF8.GetBytes(response); await clientSocket.SendAsync(responseBytes, SocketFlags.None); Console.WriteLine("已回應訊息給客戶端"); } catch (Exception ex) { Console.WriteLine($"處理客戶端時發生錯誤: {ex.Message}"); } finally { clientSocket.Close(); } } } 此範例的架構分為以下幾個函數: - RunServerAsync: 啟動伺服器,監聽連接。 - HandleClientAsync: 處理每一個客戶端的連線與通信。 - Main(): 呼叫伺服器啟動函數 RunServerAsync。 伺服器會等待客戶端的連線請求,接收訊息後回應簡單的文字訊息。 每個客戶端的連線會由 HandleClientAsync 函數非同步處理,確保伺服器能同時處理多個連接。 希望這能幫助你!若還有疑問或需要進一步改進,隨時告訴我。