在C#中,Socket通信是一種用于實現網絡通信的底層技術。通過Socket,程序可以在網絡上與其他設備進行數據交換。以下是如何使用C#中的System.Net.Sockets
命名空間來實現Socket通信的詳細步驟。
1. Socket通信的基本概念
- Socket: 一個Socket是網絡通信的端點,它封裝了IP地址和端口號。
- Server(服務器端): 監聽客戶端的連接請求,并處理數據。
- Client(客戶端): 主動發起與服務器的連接,并發送或接收數據。
- 協議: 常用的協議有TCP(面向連接、可靠傳輸)和UDP(無連接、不可靠但高效)。
2. 使用TCP協議的Socket通信
(1) 服務器端代碼
服務器端需要監聽指定的IP地址和端口,等待客戶端的連接請求。
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;class TcpServer
{static void Main(string[] args){// 定義IP地址和端口號IPAddress ipAddress = IPAddress.Parse("127.0.0.1"); // 本地回環地址int port = 8888;// 創建Socket對象Socket listener = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);try{// 綁定IP地址和端口listener.Bind(new IPEndPoint(ipAddress, port));listener.Listen(10); // 設置最大連接數為10Console.WriteLine("服務器已啟動,等待客戶端連接...");// 接受客戶端連接Socket handler = listener.Accept();Console.WriteLine("客戶端已連接!");// 接收數據byte[] buffer = new byte[1024];int bytesReceived = handler.Receive(buffer);string receivedData = Encoding.UTF8.GetString(buffer, 0, bytesReceived);Console.WriteLine($"接收到的數據: {receivedData}");// 發送響應數據string response = "Hello from server!";byte[] responseData = Encoding.UTF8.GetBytes(response);handler.Send(responseData);// 關閉連接handler.Shutdown(SocketShutdown.Both);handler.Close();}catch (Exception ex){Console.WriteLine($"發生錯誤: {ex.Message}");}finally{listener.Close();}}
}
(2) 客戶端代碼
客戶端需要主動連接到服務器,并發送或接收數據。
using System;
using System.Net.Sockets;
using System.Text;class TcpClientExample
{static void Main(string[] args){// 定義服務器的IP地址和端口號string serverIp = "127.0.0.1";int port = 8888;// 創建Socket對象Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);try{// 連接到服務器client.Connect(serverIp, port);Console.WriteLine("已連接到服務器!");// 發送數據string message = "Hello from client!";byte[] data = Encoding.UTF8.GetBytes(message);client.Send(data);// 接收服務器響應byte[] buffer = new byte[1024];int bytesReceived = client.Receive(buffer);string response = Encoding.UTF8.GetString(buffer, 0, bytesReceived);Console.WriteLine($"服務器響應: {response}");}catch (Exception ex){Console.WriteLine($"發生錯誤: {ex.Message}");}finally{client.Close();}}
}
3. 使用UDP協議的Socket通信
(1) 服務器端代碼
UDP是無連接的協議,服務器不需要顯式接受連接。
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;class UdpServer
{static void Main(string[] args){// 定義IP地址和端口號IPAddress ipAddress = IPAddress.Parse("127.0.0.1");int port = 9999;// 創建Socket對象UdpClient udpServer = new UdpClient(port);Console.WriteLine("UDP服務器已啟動,等待數據...");// 接收數據IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);byte[] receivedData = udpServer.Receive(ref remoteEndPoint);string message = Encoding.UTF8.GetString(receivedData);Console.WriteLine($"接收到的數據: {message} 來自 {remoteEndPoint}");// 發送響應數據string response = "Hello from UDP server!";byte[] responseData = Encoding.UTF8.GetBytes(response);udpServer.Send(responseData, responseData.Length, remoteEndPoint);// 關閉SocketudpServer.Close();}
}
(2) 客戶端代碼
客戶端直接向服務器發送數據,無需建立連接。?
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;class UdpClientExample
{static void Main(string[] args){// 定義服務器的IP地址和端口號string serverIp = "127.0.0.1";int port = 9999;// 創建Socket對象UdpClient udpClient = new UdpClient();try{// 發送數據IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse(serverIp), port);string message = "Hello from UDP client!";byte[] data = Encoding.UTF8.GetBytes(message);udpClient.Send(data, data.Length, serverEndPoint);// 接收服務器響應byte[] receivedData = udpClient.Receive(ref serverEndPoint);string response = Encoding.UTF8.GetString(receivedData);Console.WriteLine($"服務器響應: {response}");}catch (Exception ex){Console.WriteLine($"發生錯誤: {ex.Message}");}finally{udpClient.Close();}}
}
4. 注意事項
- 異常處理: 在實際開發中,必須對網絡異常(如超時、連接中斷等)進行處理。
- 多線程支持: 如果需要同時處理多個客戶端連接,可以使用多線程或異步編程。
- 防火墻和端口: 確保服務器的端口未被防火墻阻止。
- 編碼格式: 數據傳輸時需注意編碼格式的一致性(如UTF-8)。
以上是C#中Socket通信的基本實現方法。根據實際需求,可以選擇TCP或UDP協議,并結合異步編程(如async/await
)提高性能和可擴展性。
C# async/await的使用_c# async await用法-CSDN博客文章瀏覽閱讀1.3k次,點贊5次,收藏8次。本文詳細介紹了C#中async和await關鍵字在實現異步編程中的作用,包括如何定義異步方法、await用于等待異步操作完成的特點,以及注意事項,如避免阻塞操作和正確嵌套。這些技術有助于提升程序性能和響應性。https://blog.csdn.net/wangnaisheng/article/details/136037585?spm=1011.2415.3001.5331
?