c#5 async Task非同步Socket服務端接收資料
阿新 • • 發佈:2019-01-30
c#5有的新特性async非同步關鍵字配合Task使用。
非同步Task將很大的提高程式效能,所以這次我來分享一段採用async關鍵字和Task的socket服務端程式碼
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 SocketServer { class Program { private static byte[] result = new byte[1024]; private static int myProt = 8885; //埠 static Socket serverSocket; static void Main(string[] args) { CancellationTokenSource cts = new CancellationTokenSource(); //伺服器IP地址 IPAddress ip = IPAddress.Parse("127.0.0.1"); serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); serverSocket.Bind(new IPEndPoint(ip, myProt)); //繫結IP地址:埠 serverSocket.Listen(10); //設定最多10個排隊連線請求 try { Console.WriteLine("啟動監聽{0}成功", serverSocket.LocalEndPoint.ToString()); //通過Clientsoket傳送資料 ListenClientConnect(cts.Token).Wait(); Console.ReadLine(); } finally { cts.Cancel(); serverSocket.Shutdown(SocketShutdown.Both); serverSocket.Close(); } } /// <summary> /// 監聽客戶端連線 /// </summary> private static async Task ListenClientConnect(CancellationToken ct) { while (!ct.IsCancellationRequested) { Socket clientSocket = serverSocket.Accept(); clientSocket.Send(Encoding.ASCII.GetBytes("Server Say Hello")); await ReceiveMessage(clientSocket, ct); await Task.Delay(1000); } } /// <summary> /// 接收訊息 /// </summary> /// <param name="clientSocket"></param> private static async Task ReceiveMessage(object clientSocket, CancellationToken ct) { Socket myClientSocket = (Socket)clientSocket; while (!ct.IsCancellationRequested) { try { //通過clientSocket接收資料 int receiveNumber = myClientSocket.Receive(result); Console.WriteLine("接收客戶端{0}訊息{1}", myClientSocket.RemoteEndPoint.ToString(), Encoding.ASCII.GetString(result, 0, receiveNumber)); } catch (Exception ex) { Console.WriteLine(ex.Message); myClientSocket.Shutdown(SocketShutdown.Both); myClientSocket.Close(); break; } } } } }
客戶端程式碼如下:
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 SocketClient { class Program { private static byte[] result = new byte[1024]; static void Main(string[] args) { //設定伺服器IP地址 IPAddress ip = IPAddress.Parse("127.0.0.1"); Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try { clientSocket.Connect(new IPEndPoint(ip, 8885)); //配置伺服器IP與埠 Console.WriteLine("連線伺服器成功"); } catch { Console.WriteLine("連線伺服器失敗,請按回車鍵退出!"); return; } //通過clientSocket接收資料 int receiveLength = clientSocket.Receive(result); Console.WriteLine("接收伺服器訊息:{0}", Encoding.ASCII.GetString(result, 0, receiveLength)); //通過 clientSocket 傳送資料 for (int i = 0; i < 10; i++) { try { Thread.Sleep(1000); //等待1秒鐘 string sendMessage = "client send Message Hellp" + DateTime.Now; clientSocket.Send(Encoding.ASCII.GetBytes(sendMessage)); Console.WriteLine($"向伺服器傳送第{i + 1}訊息:{sendMessage}"); } catch { clientSocket.Shutdown(SocketShutdown.Both); clientSocket.Close(); break; } } Console.WriteLine("傳送完畢,按回車鍵退出"); Console.ReadLine(); } } }