欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#使用Socket進(jìn)行簡單的通訊的示例代碼

 更新時(shí)間:2023年12月25日 10:02:38   作者:rjcql  
Socket 類是基于與 Linux、macOS 或 Windows 的本機(jī)互操作性提供的托管代碼版本的套接字服務(wù),提供了一系列的接口來支持應(yīng)用層的調(diào)用,下面我們就來學(xué)習(xí)一下如何使用Socket進(jìn)行簡單的通訊,需要的可以參考下

寫在前面

在.Net的 System.Net.Sockets 命名空間中包含托管的跨平臺(tái)套接字網(wǎng)絡(luò)實(shí)現(xiàn)。 System.Net 命名空間中的所有其他網(wǎng)絡(luò)訪問類均建立在套接字的此實(shí)現(xiàn)之上。

其中的Socket 類是基于與 Linux、macOS 或 Windows 的本機(jī)互操作性提供的托管代碼版本的套接字服務(wù),提供了一系列的接口來支持應(yīng)用層的調(diào)用。

本文只是提供一個(gè)可運(yùn)行的基本示例,如果想深入了解關(guān)于TCP/IP協(xié)議的部分,可自行做更深入的知識(shí)拓展。

示例的代碼實(shí)現(xiàn)的服務(wù)端和客戶端的流程如下,展現(xiàn)了使用Socket進(jìn)行一個(gè)完整的構(gòu)建和通訊流程

服務(wù)器端:

第一步:建立一個(gè)用于通信的Socket對(duì)象

第二步:使用bind綁定IP地址和端口號(hào)

第三步:使用listen監(jiān)聽客戶端

第四步:使用accept中斷程序直到連接上客戶端

第五步:接收來自客戶端的請(qǐng)求

第六步:返回客戶端需要的數(shù)據(jù)

第七步:如果接收到客戶端已關(guān)閉連接信息就關(guān)閉服務(wù)器端

客戶端:

第一步:建立一個(gè)用于通信的Socket對(duì)象

第二步:根據(jù)指定的IP和端口connet服務(wù)器

第三步:連接成功后向服務(wù)器端發(fā)送數(shù)據(jù)請(qǐng)求

第四步:接收服務(wù)器返回的請(qǐng)求數(shù)據(jù)

第五步:如果還需要請(qǐng)求數(shù)據(jù)繼續(xù)發(fā)送請(qǐng)求

第六步:如果不需要請(qǐng)求數(shù)據(jù)就關(guān)閉客戶端并給服務(wù)器發(fā)送關(guān)閉連接信

代碼實(shí)現(xiàn)

服務(wù)端部分

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
 
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Socket Server");
 
        // 創(chuàng)建服務(wù)端Socket對(duì)象
        var serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        serverSocket.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9090));
        serverSocket.ReceiveTimeout = 1000;
        serverSocket.SendTimeout = 1000;
        serverSocket.Listen(1000);
        Console.WriteLine("服務(wù)端啟動(dòng)監(jiān)聽");
 
        var clientSocket = serverSocket.Accept();
 
        Console.WriteLine("有客戶端連上了");
 
        var task = Task.Run(() =>
        {
            while (true) {
                var receivedMsg = string.Empty;
                var receivedBytes = new byte[1024];
                var bytes = clientSocket.Receive(receivedBytes, receivedBytes.Length, 0);
                if (bytes > 0)
                {
                    receivedMsg += Encoding.UTF8.GetString(receivedBytes, 0, bytes);
                    Console.WriteLine("收到消息:" + receivedMsg);
                }
                // 服務(wù)端心跳間隔
                Thread.Sleep(1000);
            }
        });
 
        Console.ReadLine();
    }
}

客戶端部分

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
 
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Socket Client");
 
        // 創(chuàng)建客戶端Socket對(duì)象
        var clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        clientSocket.ReceiveTimeout = 1000;
        clientSocket.SendTimeout = 1000;
        clientSocket.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9090));
        Console.WriteLine("客戶端開始連接");
         
        var task = Task.Run(() =>
        {
            var idx = 0;
            while (true)
            {
                var sendMsg = "來自客戶端消息" + (++idx);
                clientSocket.Send(Encoding.UTF8.GetBytes(sendMsg));
                Console.WriteLine("客戶端發(fā)送的數(shù)據(jù):" + sendMsg);
                // 客戶端心跳間隔
                Thread.Sleep(1000);
            }
        });
 
        Console.ReadLine();
    }
}

運(yùn)行示例

 總結(jié)

之前的項(xiàng)目中一般是用現(xiàn)成的成熟框架來做通訊實(shí)現(xiàn),本例純粹是做個(gè)關(guān)于底層類庫原理知識(shí)點(diǎn)的梳理,關(guān)于粘包分包和多線程多頻道的處理,后續(xù)有時(shí)間再做深入的實(shí)踐。

到此這篇關(guān)于C#使用Socket進(jìn)行簡單的通訊的示例代碼的文章就介紹到這了,更多相關(guān)C# Socket通訊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論