C# Socket通信是指使用C#編寫的Socket程序,在網絡上與其他程序或設備進行通信。 下面將從多個方面對C# Socket通信進行詳細闡述。
一、Socket通信基礎
1、Socket概念
Socket是一種網絡通信協議,它是網絡通信中用於表示IP地址和端口號的數據結構。C# Socket編程使用Socket來進行網絡通信。
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
2、Socket通信模式
Socket通信有兩種方式:流模式和數據報模式。流模式Socket基於TCP協議,是可靠的面向連接的通信模式;數據報模式Socket基於UDP協議,是不可靠的無連接的通信模式。
//流模式Socket Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //數據報模式Socket Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
3、Socket通信流程
在進行Socket通信時,一般遵循以下流程:
①創建Socket對象
②綁定IP地址和端口號
③監聽連接請求
④接受連接請求並與客戶端建立連接
⑤數據傳輸
//創建Socket對象 Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //綁定IP地址和端口號 IPEndPoint ipPort = new IPEndPoint(IPAddress.Parse("192.168.1.100"), 9000); server.Bind(ipPort); //監聽連接請求 server.Listen(10); //接受連接請求並與客戶端建立連接 Socket client = server.Accept(); //數據傳輸 byte[] buffer = new byte[1024]; int length = client.Receive(buffer); client.Send(buffer, length, SocketFlags.None);
二、Socket通信實現
1、客戶端實現
客戶端通過創建Socket對象,連接到服務器來進行通信。下面是客戶端的代碼示例:
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint ipPort = new IPEndPoint(IPAddress.Parse("192.168.1.100"), 9000); client.Connect(ipPort); byte[] data = Encoding.UTF8.GetBytes("Hello world!"); client.Send(data);
2、服務端實現
服務端通過創建Socket對象,綁定IP地址和端口號,監聽連接請求,接受連接請求並與客戶端建立連接,進行數據傳輸來進行通信。下面是服務端的代碼示例:
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint ipPort = new IPEndPoint(IPAddress.Parse("192.168.1.100"), 9000); server.Bind(ipPort); server.Listen(10); Socket client = server.Accept(); byte[] buffer = new byte[1024]; int length = client.Receive(buffer); client.Send(buffer, length, SocketFlags.None);
三、Socket通信高級應用
1、Socket通信加密
在Socket通信過程中,為了加強數據傳輸安全性,我們可以使用加密算法對數據進行加密和解密,避免數據被竊取和篡改。C#中提供了AES和RSA等對稱加密和非對稱加密算法,以進行數據加密處理。
//AES加密 byte[] keyBytes = Encoding.UTF8.GetBytes("1234567890123456"); byte[] ivBytes = Encoding.UTF8.GetBytes("1234567890123456"); byte[] dataBytes = Encoding.UTF8.GetBytes("Hello world!"); Aes aes = Aes.Create(); aes.Key = keyBytes; aes.IV = ivBytes; ICryptoTransform transform = aes.CreateEncryptor(); byte[] resultBytes = transform.TransformFinalBlock(dataBytes, 0, dataBytes.Length); //RSA加密 byte[] dataBytes = Encoding.UTF8.GetBytes("Hello world!"); RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); RSAParameters parameters = new RSAParameters(); parameters.Exponent = new byte[] { 1, 0, 1 }; parameters.Modulus = new byte[] { 135, 162, 187, 184, 83, 155, 114, 115, 112, 191 }; rsa.ImportParameters(parameters); byte[] resultBytes = rsa.Encrypt(dataBytes, false);
2、Socket通信優化
在Socket通信中,為了提高傳輸效率,我們可以採用以下技巧:
①使用異步方式發送和接收數據;
②合併多個小數據包為一個大數據包;
③採用壓縮算法對數據進行壓縮。
//使用異步方式發送和接收 public static class SocketExtension { public static Task SendAsync(this Socket socket, byte[] data, int offset, int size, SocketFlags flags) { return Task.Factory.FromAsync((cb, state) => socket.BeginSend(data, offset, size, flags, cb, state), ar => socket.EndSend(ar), null); } public static Task ReceiveAsync(this Socket socket, byte[] data, int offset, int size, SocketFlags flags) { return Task.Factory.FromAsync((cb, state) => socket.BeginReceive(data, offset, size, flags, cb, state), ar => socket.EndReceive(ar), null); } }
四、Socket通信實例
1、Socket文件傳輸
通過Socket通信可以實現文件傳輸。以下是一個簡單的文件傳輸示例:
//服務端代碼 Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint ipPort = new IPEndPoint(IPAddress.Parse("192.168.1.100"), 9000); server.Bind(ipPort); server.Listen(10); Socket client = server.Accept(); FileStream stream = File.Open("test.txt", FileMode.Open); byte[] buffer = new byte[1024]; int length; while ((length = stream.Read(buffer, 0, buffer.Length)) > 0) { client.Send(buffer, length, SocketFlags.None); } stream.Close(); client.Shutdown(SocketShutdown.Send);
//客戶端代碼 Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint ipPort = new IPEndPoint(IPAddress.Parse("192.168.1.100"), 9000); client.Connect(ipPort); FileStream stream = File.Create("test.txt"); byte[] buffer = new byte[1024]; int length; while ((length = client.Receive(buffer, buffer.Length, SocketFlags.None)) > 0) { stream.Write(buffer, 0, length); } stream.Close(); client.Shutdown(SocketShutdown.Both);
2、Socket聊天室
通過Socket通信可以實現聊天室功能。以下是一個簡單的聊天室示例:
//服務端代碼 Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint ipPort = new IPEndPoint(IPAddress.Parse("192.168.1.100"), 9000); server.Bind(ipPort); server.Listen(10); while (true) { Socket client = server.Accept(); Task.Run(() => { while (true) { byte[] buffer = new byte[1024]; int length = client.Receive(buffer); string message = Encoding.UTF8.GetString(buffer, 0, length); //處理消息 //...... } }); }
//客戶端代碼 Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint ipPort = new IPEndPoint(IPAddress.Parse("192.168.1.100"), 9000); client.Connect(ipPort); Task.Run(() => { while (true) { byte[] buffer = new byte[1024]; int length = client.Receive(buffer); string message = Encoding.UTF8.GetString(buffer, 0, length); //處理消息 //...... } }); while (true) { string message = Console.ReadLine(); byte[] data = Encoding.UTF8.GetBytes(message); client.Send(data); }
通過以上介紹,我們可以深入了解C# Socket通信相關知識,實現對網絡通信的處理,並在實際項目中進行應用。
原創文章,作者:ZAWPO,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/361662.html