C#使用Socket進(jìn)行簡(jiǎ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)行簡(jiǎn)單的通訊的示例代碼的文章就介紹到這了,更多相關(guān)C# Socket通訊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于C# Math 處理奇進(jìn)偶不進(jìn)的實(shí)現(xiàn)代碼
下面小編就為大家?guī)硪黄P(guān)于C# Math 處理奇進(jìn)偶不進(jìn)的實(shí)現(xiàn)代碼。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-05-05
基于WebClient實(shí)現(xiàn)Http協(xié)議的Post與Get對(duì)網(wǎng)站進(jìn)行模擬登陸和瀏覽實(shí)例
這篇文章主要介紹了基于WebClient實(shí)現(xiàn)Http協(xié)議的Post與Get對(duì)網(wǎng)站進(jìn)行模擬登陸和瀏覽的方法,以實(shí)例形式詳細(xì)分析了WebClient模擬POST與GET登陸與瀏覽的過程,對(duì)于C#項(xiàng)目開發(fā)來說具有不錯(cuò)的參考借鑒價(jià)值,需要的朋友可以參考下2014-11-11
C#使用泛型方法實(shí)現(xiàn)操作不同數(shù)據(jù)類型的數(shù)組
這篇文章主要為大家詳細(xì)介紹了C#如何使用一個(gè)泛型方法對(duì)不同類型的數(shù)組進(jìn)行操作,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以學(xué)習(xí)一下2024-02-02
C#實(shí)現(xiàn)漢字轉(zhuǎn)拼音或轉(zhuǎn)拼音首字母的方法
這篇文章主要介紹了C#實(shí)現(xiàn)漢字轉(zhuǎn)拼音或轉(zhuǎn)拼音首字母的方法,涉及C#操作數(shù)組、遍歷及正則匹配的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07
C#使用正則表達(dá)式實(shí)現(xiàn)首字母轉(zhuǎn)大寫的方法
這篇文章主要介紹了C#使用正則表達(dá)式實(shí)現(xiàn)首字母轉(zhuǎn)大寫的方法,涉及C#基于正則表達(dá)式操作字符串的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11
C#使用RabbitMQ發(fā)送和接收消息工具類的實(shí)現(xiàn)
RabbitMQ是一個(gè)消息的代理器,用于接收和發(fā)送消息,本文主要介紹了C#使用RabbitMQ發(fā)送和接收消息工具類的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12

