C#使用Socket進(jìn)行簡單的通訊的示例代碼
寫在前面
在.Net的 System.Net.Sockets 命名空間中包含托管的跨平臺套接字網(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í)現(xiàn)的服務(wù)端和客戶端的流程如下,展現(xiàn)了使用Socket進(jìn)行一個(gè)完整的構(gòu)建和通訊流程
服務(wù)器端:
第一步:建立一個(gè)用于通信的Socket對象
第二步:使用bind綁定IP地址和端口號
第三步:使用listen監(jiān)聽客戶端
第四步:使用accept中斷程序直到連接上客戶端
第五步:接收來自客戶端的請求
第六步:返回客戶端需要的數(shù)據(jù)
第七步:如果接收到客戶端已關(guān)閉連接信息就關(guān)閉服務(wù)器端
客戶端:
第一步:建立一個(gè)用于通信的Socket對象
第二步:根據(jù)指定的IP和端口connet服務(wù)器
第三步:連接成功后向服務(wù)器端發(fā)送數(shù)據(jù)請求
第四步:接收服務(wù)器返回的請求數(shù)據(jù)
第五步:如果還需要請求數(shù)據(jù)繼續(xù)發(fā)送請求
第六步:如果不需要請求數(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對象
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對象
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)于底層類庫原理知識點(diǎn)的梳理,關(guān)于粘包分包和多線程多頻道的處理,后續(xù)有時(shí)間再做深入的實(shí)踐。
到此這篇關(guān)于C#使用Socket進(jìn)行簡單的通訊的示例代碼的文章就介紹到這了,更多相關(guān)C# Socket通訊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
extern外部方法使用C#的實(shí)現(xiàn)方法
這篇文章主要介紹了extern外部方法使用C#的實(shí)現(xiàn)方法,較為詳細(xì)的分析了外部方法使用C#的具體步驟與實(shí)現(xiàn)技巧,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2014-12-12
C#中使用IFormattable實(shí)現(xiàn)自定義格式化字符串輸出示例
這篇文章主要介紹了C#中使用IFormattable實(shí)現(xiàn)自定義格式字符串輸出示例,本文直接給出實(shí)例代碼,需要的朋友可以參考下2015-06-06
C# Dynamic之:ExpandoObject,DynamicObject,DynamicMetaOb的應(yīng)用(下)
本篇文章是對C#中ExpandoObject,DynamicObject,DynamicMetaOb的應(yīng)用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C#實(shí)現(xiàn)連接電子秤串口自動(dòng)稱重
這篇文章介紹了C#實(shí)現(xiàn)連接電子秤串口自動(dòng)稱重的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04

