C#使用Socket實(shí)現(xiàn)通信的方法示例
前言
文章按照 Socket 的 創(chuàng)建、連接、傳輸數(shù)據(jù)、釋放資源的過程來寫。給出方法、參數(shù)的詳細(xì)信息。
一、Socket 對象
無論是服務(wù)器還是客戶端,都要創(chuàng)建一個 SOCKET 對象,創(chuàng)建方法一致。
以下是常見的Socket對象創(chuàng)建實(shí)例
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //監(jiān)控 ip4 地址,套接字類型為 TCP ,協(xié)議類型為 TCP
其有三個構(gòu)造函數(shù)
public Socket(SocketInformation socketInformation); public Socket(SocketType socketType, ProtocolType protocolType); public Socket(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType);
第一個構(gòu)造函數(shù),SocketInformation 對象保存的是
Socket(SocketType, ProtocolType)
實(shí)質(zhì)上跟第二個構(gòu)造函數(shù)是一樣的。就好像你可以直接把( 一個蘋果 , 一個梨)直接放進(jìn)籃子,也可以先給 水果包裝好 再放進(jìn)籃子里。
下面將解釋所有參數(shù)的意義。
SocketType
指定 Socket 類的實(shí)例表示的套接字類型。
TCP 用主機(jī)的IP地址加上主機(jī)上的端口號作為 TCP 連接的端點(diǎn),這種端點(diǎn)就叫做套接字(socket)或插口。 套接字用(IP地址:端口號)表示。
SocketType 是enum 類型,其字段如下
ProtocolType
表示協(xié)議類型,是一個enum 類型。
其所有字段如下
AddressFamily
表示使用的網(wǎng)絡(luò)尋址方案,是一個 enum 類型。
二、Bind() 綁定與 Connect() 連接
Bind() 用于綁定IPEndPoint 對象,在服務(wù)端使用。
Connect() 在客戶端使用,用于連接服務(wù)端。
創(chuàng)建 Socket 對象后,接著綁定本地Socket / 連接服務(wù)端。
Bind()
public void Bind (System.Net.EndPoint localEP);
使用方法
Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPAddress iP = IPAddress.Parse("127.0.0.1"); //上面不重要,看下面 //IPEndPoint iPEndPoint = new IPEndPoint(iP, 2300); //serverSocket.Bind(iPEndPoint); serverSocket.Bind(new IPEndPoint(iP, 2300))
你將在在本地創(chuàng)建IPEndPoint 對象,擁有此 ip:post 的訪問權(quán)限。目的是綁定本地機(jī)器的某個端口,所有經(jīng)過此端口的數(shù)據(jù)就歸你管了。
Connect()
與遠(yuǎn)程主機(jī)建立連接。Connect() 有四個重載方法,不必關(guān)注,只需知道,必需提供 IP 和 Post 兩個值。
使用方法
IPAddress iP = IPAddress.Parse("127.0.0.1"); IPEndPoint iPEndPoint = new IPEndPoint(iP, 2300); Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //創(chuàng)建與遠(yuǎn)程主機(jī)的連接 serverSocket.Connect(iPEndPoint);
三、Listen() 監(jiān)聽請求連接 和 Accept() 接收連接請求
Listen()
監(jiān)控所有發(fā)送到此主機(jī)的、特點(diǎn)端口的連接請求。服務(wù)端使用,客戶端不需要。
public void Listen (int backlog);
使用 Bind() 后,使用 Listen() 方法進(jìn)行監(jiān)控,backlog 參數(shù)指定可排隊(duì)等待接受的傳入連接的數(shù)量,即掛起的連接隊(duì)列的最大長度。
示例
serverSocket.Listen(10); //開始監(jiān)聽
Accept()
Accept() 以同步方式監(jiān)聽套接字,在連接請求隊(duì)列中提取第一個掛起的連接請求,然后創(chuàng)建并返回一個新的 Socket 對象。
代碼示例
//創(chuàng)建終結(jié)點(diǎn)(EndPoint) IPAddress ip = IPAddress.Any; IPEndPoint ipe = new IPEndPoint(ip, 8000); //創(chuàng)建 socket 并開始監(jiān)聽 Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); serverSocket.Bind(ipe); serverSocket.Listen(10);//開始監(jiān)聽 //接受到client連接,為此連接建立新的socket,并接受信息 Socket temp = serverSocket.Accept();//為新建連接創(chuàng)建新的socket
//關(guān)閉連接 temp.Close();
注意的是,每次建立連接是一個 Accept() 對象,如果你要進(jìn)行 服務(wù)器-客戶端互相通訊,應(yīng)使用同一個 Accept() 對象。每個 Accept 對象都是 從客戶端請求建立開始的,期間只要使用同一個 Accept 對象,都可以進(jìn)行數(shù)據(jù)傳輸。
四、Receive() 與 Send()
Receive() 接收信息
Send() 發(fā)送信息
在服務(wù)端和客戶端都使用這兩個方法。
Receive()
使用示例
string recvStr = ""; byte[] recvBytes = new byte[1024]; int bytes; bytes = temp.Receive(recvBytes, recvBytes.Length, 0);//從客戶端接受信息 recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);
直接從微軟那復(fù)制來的。
參數(shù)
Byte[] buffer
Byte類型的數(shù)組,它是存儲接收到的數(shù)據(jù)的位置。
Int32 offset
buffer參數(shù)中的位置,用于存儲所接收的數(shù)據(jù)。
Int32 size
要接收的字節(jié)數(shù)。
SocketFlags socketFlags
SocketFlags值的按位組合。
SocketError errorCode
一個SocketError對象,它存儲套接字錯誤。
socketFlags 默認(rèn)值為0 或 None ,筆者沒有搞懂socketFlags 的應(yīng)用場景。
返回
返回已成功讀取的字節(jié)數(shù)。
Send()
send()跟Receive()用法相似,
示例代碼如下
string str = "hello"; byte[] a = Encoding.UTF8.GetBytes(str); send = socket.Send(a, 0);
發(fā)送/接收 都是使用 byte[] 字節(jié)流,所以接收時要進(jìn)行轉(zhuǎn)換。
五、釋放資源
有 Accept 釋放和 Socket 的釋放。
Accept 是連接對象,一個 Socket 可能有數(shù)十個 Accept 連接。
使用 Shutdown( ) 方法可以 禁止 Asscpt 對象的操作(禁用某個 Socket 對象 的發(fā)送和接收)。
public void Shutdown (System.Net.Sockets.SocketShutdown how);
SocketShutdown 是一個 enum 類型。
實(shí)例
temp.Shutdown(SocketShutdown.Receive);//禁止接收
close()
會直接釋放資源,Accept 和 Socket 對象都可以使用。使用后對象將徹底釋放。
六、IPAddress 和IPEndPoint
//引入 using System.Net;
IPAddress 用來處理IP地址、轉(zhuǎn)換IP地址
IPAddress.Parse() 方法可以把以小數(shù)點(diǎn)隔分的十進(jìn)制 IP 表示轉(zhuǎn)化成 IPAddress 類。
IPAddress ip = IPAddress.Parse("127.0.0.1");//把ip地址字符串轉(zhuǎn)換為IPAddress類型的實(shí)例
IPAddress提供4個只讀字段
Any 用于代表本地系統(tǒng)可用的任何IP地址
Broadcase用于代表本地網(wǎng)絡(luò)的IP廣播地址
Loopback用于代表系統(tǒng)的回送地址
None用于代表系統(tǒng)上沒有網(wǎng)絡(luò)接口
IPEndPoint 表示IPAddress對象與端口的綁定
IPAddress ip = IPAddress.Any; //把ip地址字符串轉(zhuǎn)換為IPAddress類型的實(shí)例 IPEndPoint ipe = new IPEndPoint(ip, 8000);//用指定的端口和ip初始化IPEndPoint類的新實(shí)例
上面的代碼,創(chuàng)建一個監(jiān)控點(diǎn),端口是 8000,對象是 本地所有IP。
另外,此類能夠獲取查看端口的值范圍,除此外,此類沒有太大意義。
以上就是C#使用Socket實(shí)現(xiàn)通信的方法示例的詳細(xì)內(nèi)容,更多關(guān)于C# Socket通信的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Linq利用Distinct去除重復(fù)項(xiàng)問題(可自己指定)
這篇文章主要介紹了Linq利用Distinct去除重復(fù)項(xiàng)問題(可自己指定),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01C# 通過NI-VISA操作Tektronix TBS 2000B系列示波器的實(shí)現(xiàn)步驟
這篇文章主要介紹了C# 通過NI-VISA操作Tektronix TBS 2000B系列示波器的實(shí)現(xiàn)步驟,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-02-02C#?WPF后臺動態(tài)添加控件實(shí)戰(zhàn)教程
最近嘗試用wpf在后臺動態(tài)添加控件,所以下面這篇文章主要給大家介紹了關(guān)于C#?WPF后臺動態(tài)添加控件的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05WinForm使用DecExpress控件中的ChartControl插件繪制圖表
這篇文章介紹了WinForm使用DecExpress控件中的ChartControl插件繪制圖表的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-05-05C# OpenCvSharp實(shí)現(xiàn)圖片批量改名
這篇文章主要為大家詳細(xì)介紹了C#如何結(jié)合OpenCvSharp實(shí)現(xiàn)圖片批量改名功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03C#實(shí)現(xiàn)軟件防破解和防調(diào)試的幾種有效措施
軟件保護(hù)在現(xiàn)代應(yīng)用程序開發(fā)中變得越來越重要,尤其是在面對軟件盜版、調(diào)試和破解等問題時,在C#開發(fā)中,雖然沒有完全防止破解的辦法,但通過采取一些有效的防護(hù)措施,可以顯著增加破解的難度并保護(hù)軟件的知識產(chǎn)權(quán),本篇文章將探討在C#中實(shí)現(xiàn)軟件防破解和防調(diào)試的幾種常見技術(shù)2025-03-03C# WPF上位機(jī)實(shí)現(xiàn)和下位機(jī)TCP通訊的方法
這篇文章主要介紹了C# WPF上位機(jī)實(shí)現(xiàn)和下位機(jī)TCP通訊的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-03-03C#操作圖片讀取和存儲SQLserver實(shí)現(xiàn)代碼
用C#將Image轉(zhuǎn)換成byte[]并插入數(shù)據(jù)庫/將圖片數(shù)據(jù)從SQLserver中取出來并顯示到pictureBox控件上,接下來將為你詳細(xì)介紹下實(shí)現(xiàn)步驟,感興趣的你可以參考下2013-03-03