C#使用Socket進(jìn)行簡單的通訊的示例代碼
寫在前面
在.Net的 System.Net.Sockets 命名空間中包含托管的跨平臺套接字網(wǎng)絡(luò)實現(xiàn)。 System.Net 命名空間中的所有其他網(wǎng)絡(luò)訪問類均建立在套接字的此實現(xiàn)之上。
其中的Socket 類是基于與 Linux、macOS 或 Windows 的本機(jī)互操作性提供的托管代碼版本的套接字服務(wù),提供了一系列的接口來支持應(yīng)用層的調(diào)用。
本文只是提供一個可運(yùn)行的基本示例,如果想深入了解關(guān)于TCP/IP協(xié)議的部分,可自行做更深入的知識拓展。
示例的代碼實現(xiàn)的服務(wù)端和客戶端的流程如下,展現(xiàn)了使用Socket進(jìn)行一個完整的構(gòu)建和通訊流程
服務(wù)器端:
第一步:建立一個用于通信的Socket對象
第二步:使用bind綁定IP地址和端口號
第三步:使用listen監(jiān)聽客戶端
第四步:使用accept中斷程序直到連接上客戶端
第五步:接收來自客戶端的請求
第六步:返回客戶端需要的數(shù)據(jù)
第七步:如果接收到客戶端已關(guān)閉連接信息就關(guān)閉服務(wù)器端
客戶端:
第一步:建立一個用于通信的Socket對象
第二步:根據(jù)指定的IP和端口connet服務(wù)器
第三步:連接成功后向服務(wù)器端發(fā)送數(shù)據(jù)請求
第四步:接收服務(wù)器返回的請求數(shù)據(jù)
第五步:如果還需要請求數(shù)據(jù)繼續(xù)發(fā)送請求
第六步:如果不需要請求數(shù)據(jù)就關(guān)閉客戶端并給服務(wù)器發(fā)送關(guān)閉連接信
代碼實現(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對象 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ù)端啟動監(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對象 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àn)成的成熟框架來做通訊實現(xiàn),本例純粹是做個關(guān)于底層類庫原理知識點的梳理,關(guān)于粘包分包和多線程多頻道的處理,后續(xù)有時間再做深入的實踐。
到此這篇關(guān)于C#使用Socket進(jìn)行簡單的通訊的示例代碼的文章就介紹到這了,更多相關(guān)C# Socket通訊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#中使用IFormattable實現(xiàn)自定義格式化字符串輸出示例
這篇文章主要介紹了C#中使用IFormattable實現(xiàn)自定義格式字符串輸出示例,本文直接給出實例代碼,需要的朋友可以參考下2015-06-06C# Dynamic之:ExpandoObject,DynamicObject,DynamicMetaOb的應(yīng)用(下)
本篇文章是對C#中ExpandoObject,DynamicObject,DynamicMetaOb的應(yīng)用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05