C# Socket通信詳解

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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
ZAWPO的頭像ZAWPO
上一篇 2025-02-25 18:17
下一篇 2025-02-25 18:17

相關推薦

  • Python中使用socket傳輸圖片

    本文將從多個方面介紹如何使用Python中的socket模塊傳輸圖片,涉及到準備工作、發送方部分和接收方部分的詳細代碼實現。 一、準備工作 在使用Python中的socket模塊進…

    編程 2025-04-28
  • Python Socket阻塞問題的解析

    本文將從多個方面對Python socket阻塞問題進行詳細闡述,包括阻塞的原因、影響、解決方法等等。 一、阻塞的原因 阻塞是指在等待某個事件的過程中,該進程無法處理其他任務,直到…

    編程 2025-04-27
  • 跨域通信浮標——實現客戶端之間的跨域通信

    本文將介紹跨域通信浮標的使用方法,該浮標可以實現客戶端之間的跨域通信,解決了瀏覽器同源策略的限制,讓開發者能夠更加方便地進行跨域通信。 一、浮標的原理 跨域通信浮標的原理是基於浮動…

    編程 2025-04-27
  • 通信專業Python和Java的開發技巧

    本文旨在介紹通信專業Python和Java的開發技巧,為讀者提供實用且可操作的思路和方法。 一、Python在通信領域中的應用 Python是一種優秀的程序設計語言,因其易學易用、…

    編程 2025-04-27
  • C# Socket關閉後客戶端仍可連接的解決方法

    對於C# Socket通信中的一些問題,多數人可能已經熟知,但是有些問題仍然困擾着一部分人,例如Socket關閉後,客戶端仍然可以連接。本篇文章將在此問題為中心,圍繞該問題的原因和…

    編程 2025-04-27
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁盤中。在執行sync之前,所有的文件系統更新將不會立即寫入磁盤,而是先緩存在內存…

    編程 2025-04-25
  • 神經網絡代碼詳解

    神經網絡作為一種人工智能技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網絡的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網絡模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • Linux修改文件名命令詳解

    在Linux系統中,修改文件名是一個很常見的操作。Linux提供了多種方式來修改文件名,這篇文章將介紹Linux修改文件名的詳細操作。 一、mv命令 mv命令是Linux下的常用命…

    編程 2025-04-25
  • Python輸入輸出詳解

    一、文件讀寫 Python中文件的讀寫操作是必不可少的基本技能之一。讀寫文件分別使用open()函數中的’r’和’w’參數,讀取文件…

    編程 2025-04-25
  • nginx與apache應用開發詳解

    一、概述 nginx和apache都是常見的web服務器。nginx是一個高性能的反向代理web服務器,將負載均衡和緩存集成在了一起,可以動靜分離。apache是一個可擴展的web…

    編程 2025-04-25

發表回復

登錄後才能評論