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-tw/n/361662.html
微信掃一掃
支付寶掃一掃