最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#使用Socket實(shí)現(xiàn)通信的方法示例

 更新時(shí)間:2024年06月16日 11:30:33   作者:0仰望星空007  
這篇文章主要介紹了C#使用Socket實(shí)現(xiàn)通信的方法示例,文章按照 Socket 的 創(chuàng)建、連接、傳輸數(shù)據(jù)、釋放資源的過程來寫,給出方法、參數(shù)的詳細(xì)信息,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下

前言

文章按照 Socket 的 創(chuàng)建、連接、傳輸數(shù)據(jù)、釋放資源的過程來寫。給出方法、參數(shù)的詳細(xì)信息。

一、Socket 對象

無論是服務(wù)器還是客戶端,都要創(chuàng)建一個(gè) SOCKET 對象,創(chuàng)建方法一致。

以下是常見的Socket對象創(chuàng)建實(shí)例

Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//監(jiān)控 ip4 地址,套接字類型為 TCP ,協(xié)議類型為 TCP

其有三個(gè)構(gòu)造函數(shù)

public Socket(SocketInformation socketInformation);
public Socket(SocketType socketType, ProtocolType protocolType);
public Socket(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType);

第一個(gè)構(gòu)造函數(shù),SocketInformation 對象保存的是

Socket(SocketType, ProtocolType)

實(shí)質(zhì)上跟第二個(gè)構(gòu)造函數(shù)是一樣的。就好像你可以直接把( 一個(gè)蘋果 , 一個(gè)梨)直接放進(jìn)籃子,也可以先給 水果包裝好 再放進(jìn)籃子里。

下面將解釋所有參數(shù)的意義。

SocketType

指定 Socket 類的實(shí)例表示的套接字類型。

TCP 用主機(jī)的IP地址加上主機(jī)上的端口號作為 TCP 連接的端點(diǎn),這種端點(diǎn)就叫做套接字(socket)或插口。 套接字用(IP地址:端口號)表示。

SocketType 是enum 類型,其字段如下

在這里插入圖片描述

ProtocolType

表示協(xié)議類型,是一個(gè)enum 類型。

其所有字段如下

在這里插入圖片描述

AddressFamily

表示使用的網(wǎng)絡(luò)尋址方案,是一個(gè) 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ī)器的某個(gè)端口,所有經(jīng)過此端口的數(shù)據(jù)就歸你管了。

Connect()

與遠(yuǎn)程主機(jī)建立連接。Connect() 有四個(gè)重載方法,不必關(guān)注,只需知道,必需提供 IP 和 Post 兩個(gè)值。

使用方法

    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ì)列中提取第一個(gè)掛起的連接請求,然后創(chuàng)建并返回一個(gè)新的 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();

注意的是,每次建立連接是一個(gè) Accept() 對象,如果你要進(jìn)行 服務(wù)器-客戶端互相通訊,應(yīng)使用同一個(gè) Accept() 對象。每個(gè) Accept 對象都是 從客戶端請求建立開始的,期間只要使用同一個(gè) Accept 對象,都可以進(jìn)行數(shù)據(jù)傳輸。

四、Receive() 與 Send()

Receive() 接收信息

Send() 發(fā)送信息

在服務(wù)端和客戶端都使用這兩個(gè)方法。

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

一個(gè)SocketError對象,它存儲套接字錯(cuò)誤。

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é)流,所以接收時(shí)要進(jìn)行轉(zhuǎn)換。

五、釋放資源

有 Accept 釋放和 Socket 的釋放。

Accept 是連接對象,一個(gè) Socket 可能有數(shù)十個(gè) Accept 連接。

使用 Shutdown( ) 方法可以 禁止 Asscpt 對象的操作(禁用某個(gè) Socket 對象 的發(fā)送和接收)。

public void Shutdown (System.Net.Sockets.SocketShutdown how);

SocketShutdown 是一個(gè) 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個(gè)只讀字段

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)建一個(gè)監(jiān)控點(diǎn),端口是 8000,對象是 本地所有IP。

另外,此類能夠獲取查看端口的值范圍,除此外,此類沒有太大意義。

以上就是C#使用Socket實(shí)現(xiàn)通信的方法示例的詳細(xì)內(nèi)容,更多關(guān)于C# Socket通信的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C# DataGridView綁定數(shù)據(jù)源的方法

    C# DataGridView綁定數(shù)據(jù)源的方法

    這篇文章主要為大家詳細(xì)介紹了C# DataGridView綁定數(shù)據(jù)源的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • C#中的并發(fā)編程與.NET任務(wù)并行庫的使用示例和常見問題

    C#中的并發(fā)編程與.NET任務(wù)并行庫的使用示例和常見問題

    在現(xiàn)代軟件開發(fā)中,.NET Framework通過引入任務(wù)并行庫(TPL)和并發(fā)集合類型,簡化了并發(fā)復(fù)雜性,提高程序的性能、可維護(hù)性和可擴(kuò)展性,并發(fā)集合設(shè)計(jì)上允許多線程安全訪問,此外,TPL通過Task類簡化異步操作,正確使用這些工具可避免死鎖和競爭條件等常見問題
    2024-09-09
  • C#實(shí)現(xiàn)的自定義郵件發(fā)送類完整實(shí)例(支持多人多附件)

    C#實(shí)現(xiàn)的自定義郵件發(fā)送類完整實(shí)例(支持多人多附件)

    這篇文章主要介紹了C#實(shí)現(xiàn)的自定義郵件發(fā)送類,具有支持多人多附件的功能,涉及C#郵件操作的相關(guān)技巧,需要的朋友可以參考下
    2015-12-12
  • C#面向?qū)ο笤O(shè)計(jì)原則之單一職責(zé)原則

    C#面向?qū)ο笤O(shè)計(jì)原則之單一職責(zé)原則

    這篇文章介紹了C#面向?qū)ο笤O(shè)計(jì)原則之單一職責(zé)原則,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-03-03
  • C#屬性訪問器Set與Get詳解

    C#屬性訪問器Set與Get詳解

    本文總結(jié)了C#中屬性Set和Get訪問器的核心概念,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-01-01
  • C#實(shí)現(xiàn)SHP文件讀取與地圖顯示的完整教程

    C#實(shí)現(xiàn)SHP文件讀取與地圖顯示的完整教程

    在地理信息系統(tǒng)(GIS)開發(fā)中,SHP文件是一種常見的矢量數(shù)據(jù)格式,本文將詳細(xì)介紹如何使用C#讀取SHP文件并實(shí)現(xiàn)地圖顯示功能,包括坐標(biāo)轉(zhuǎn)換、圖形渲染、平移縮放操作以及屬性表展示,需要的朋友可以參考下
    2025-09-09
  • Unity為軟件添加使用有效期的具體步驟

    Unity為軟件添加使用有效期的具體步驟

    今天小編遇到這樣一個(gè)需求需要為軟件設(shè)定一個(gè)使用有效期,當(dāng)超過指定時(shí)間后,程序無法執(zhí)行,實(shí)現(xiàn)思路并不復(fù)雜,今天小編通過本文給大家分享Unity為軟件添加使用有效期的具體步驟,感興趣的朋友一起看看吧
    2022-03-03
  • C#提取網(wǎng)頁中超鏈接link和text部分的方法

    C#提取網(wǎng)頁中超鏈接link和text部分的方法

    這篇文章主要介紹了C#提取網(wǎng)頁中超鏈接link和text部分的方法,涉及C#正則表達(dá)式及字符串操作相關(guān)技巧,需要的朋友可以參考下
    2016-02-02
  • C#使用yield關(guān)鍵字讓自定義集合實(shí)現(xiàn)foreach遍歷的方法

    C#使用yield關(guān)鍵字讓自定義集合實(shí)現(xiàn)foreach遍歷的方法

    這篇文章主要介紹了C#使用yield關(guān)鍵字讓自定義集合實(shí)現(xiàn)foreach遍歷的方法,需要的朋友可以參考下
    2014-08-08
  • C#中添加窗口的步驟詳解

    C#中添加窗口的步驟詳解

    下面小編就為大家?guī)硪黄狢#中添加窗口的步驟詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-02-02

最新評論

临江市| 徐闻县| 常山县| 鄂托克前旗| 永和县| 五指山市| 云霄县| 孟州市| 东丽区| 林芝县| 屯门区| 廊坊市| 柳林县| 托克托县| 崇义县| 芜湖县| 包头市| 兴海县| 娄底市| 新乡县| 乌恰县| 南充市| 桐庐县| 仲巴县| 巫溪县| 绥中县| 金塔县| 怀远县| 长治县| 竹溪县| 手游| 正安县| 吴江市| 阿克苏市| 贡觉县| 桐城市| 许昌县| 太仆寺旗| 乐都县| 奈曼旗| 文登市|