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

C#實(shí)現(xiàn)TCP和UDP通信的示例詳解

 更新時(shí)間:2023年03月01日 08:46:00   作者:微小冷  
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)TCP和UDP通信的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下

C#在命名空間System.Net.Sockets中對伯克利套接字提供了良好的封裝,提供了完善的TCP和UDP通信功能。

從編程的角度出發(fā),TCP和UDP最大的區(qū)別是,TCP存在TcpClientTcpLinster兩個(gè)對象用于信息的傳遞,二者一發(fā)一收,十分完備。而UDP則只有一個(gè)類UdpClient,換言之,UDP通信是不分服務(wù)端和客戶端,通信雙方對等。

UDP發(fā)送

至少在形式上,UDP比TCP更簡單,所以先從UDP講起。

考慮到通信那肯定是有發(fā)有收才行,如果只用C#自己,那么肯定得上個(gè)多線程什么的才能跑通。為了避免問題復(fù)雜化,故推薦使用這款NetAssist網(wǎng)絡(luò)助手。

有了這個(gè),只要在C#里寫一套發(fā)送代碼,就可以在NetAssist上看到發(fā)送的內(nèi)容,比較實(shí)用。又因?yàn)椴捎庙敿?jí)語句,導(dǎo)致用下面這區(qū)區(qū)幾行代碼就可以完成一次套接字編程的實(shí)踐,非常劃算

using System.Net.Sockets;
using System.Net;
using System.Text;

//由于收發(fā)都在本機(jī),所以只用一個(gè)IP地址
IPAddress addr = IPAddress.Parse("127.0.0.1");

var ptLocal = new IPEndPoint(addr, 9001);  //本機(jī)節(jié)點(diǎn),用于發(fā)送
var ptDst = new IPEndPoint(addr, 9002);    //目標(biāo)節(jié)點(diǎn)

var udp = new UdpClient(ptLocal);          //在本地建立udp服務(wù)
byte[] buffer = Encoding.UTF8.GetBytes("hello");
udp.Send(buffer, buffer.Length, ptDst);    //將內(nèi)容發(fā)給ptDst

效果為

在網(wǎng)絡(luò)中,兩個(gè)電腦要想通信,那么必須要知道彼此的位置,而在網(wǎng)絡(luò)中描述一個(gè)計(jì)算機(jī)的位置,用的就是IP地址。但光有一個(gè)地址還不行,計(jì)算機(jī)要處理這么多任務(wù),接收這么多服務(wù),在IP地址之外還得有個(gè)端口才可以。這種感覺大致相當(dāng)于,IP是一棟樓,端口就是門牌號(hào)。

而127.0.0.1是一個(gè)特殊的地址,即主機(jī)環(huán)回地址,很好理解,就是指向本地的地址,有了這個(gè),就可以自己和自己通信了。

UDP接收

發(fā)送和接收看上去是對偶,但難度上完全是兩回事,這種感覺就像你給女神發(fā)消息,其實(shí)很方便,按下發(fā)送鍵就完事兒了。但你等女神的消息,那就比較煎熬,因?yàn)槟悴淮_定她什么時(shí)候會(huì)發(fā)過來,所以得一直等著。

所以,接收比發(fā)送麻煩多了,最起碼得有一個(gè)死循環(huán),如果對方?jīng)]消息,就死等。

// 前面的代碼和發(fā)送代碼一樣
while (true)
{
    var received = udp.Receive(ref ptDst);
    string info = Encoding.UTF8.GetString(received);
    info =$" {ptDst.Address}:{ptDst.Port}:{info}";
    Console.WriteLine(info);
    byte[] buf = Encoding.UTF8.GetBytes("What are our children's names");
    udp.Send(buf, buf.Length, ptDst);    //將內(nèi)容發(fā)給ptDst
}

其中udp.Receive就起到死等的作用,如果收不到,程序就不執(zhí)行,最后結(jié)果如下

TCP發(fā)送

UDP協(xié)議的好處是,UdpClient包打天下,既可以發(fā)送也可以接收,而發(fā)送者和接收者的身份,需要通過端口號(hào)來區(qū)分。

TCP則不然,TCP本身分為服務(wù)端和客戶端,服務(wù)端在C#中用TcpListener類來實(shí)現(xiàn),觀其名而知其義,服務(wù)端的作用是監(jiān)聽,相應(yīng)地客戶端TcpClient用于發(fā)送。其通信邏輯是,客戶端將發(fā)送工具和消息內(nèi)容一起發(fā)送給服務(wù)端,服務(wù)端再用客戶端自己的發(fā)送工具進(jìn)行回信。

NetAssist同樣提供了TCP的發(fā)送和接收功能,為了讓C#代碼相對簡單,這里先選擇服務(wù)端,即TCP Server,端口選擇9002,接下來仍用最短的代碼來演示一下C#的TCP發(fā)送功能,需要注意客戶端和服務(wù)端的端口需要統(tǒng)一一下。

// 引用的命名空間還是上面這些
TcpClient tcp = new TcpClient("127.0.0.1", 9002);
NetworkStream n = tcp.GetStream();
var w = new BinaryWriter(n);
byte[] buffer = Encoding.UTF8.GetBytes("hello");
w.Write(buffer, 0, buffer.Length);
w.Flush();

效果如下

TCP接收

TCP的接收從邏輯上來說要比UDP更高級(jí)一點(diǎn),畢竟TcpListener又稱服務(wù)端,名義上來說要服務(wù)于所有人。

TcpListener serv = new TcpListener(IPAddress.Any, 9002);
serv.Start();

Byte[] bytes = new Byte[256];
int i;
while (true)
{
    var c = serv.AcceptTcpClient();
    var n = c.GetStream();
    while ((i = n.Read(bytes, 0, bytes.Length)) != 0)
    {
        var msg = Encoding.ASCII.GetString(bytes, 0, i);
        Console.WriteLine($"Received: {msg}");
        msg += ", too";
        var data = Encoding.ASCII.GetBytes(msg);
        n.Write(data, 0, data.Length);
    }
}

上面代碼中,serv.AcceptTcpClient()根據(jù)監(jiān)控到的信息,返回一個(gè)新的客戶端對象;c.GetStream()返回一個(gè)網(wǎng)絡(luò)流對象,和其他Stream一樣,通過Read方法,可以將二進(jìn)制數(shù)據(jù)寫入到字節(jié)數(shù)組中。

效果如下

到此這篇關(guān)于C#實(shí)現(xiàn)TCP和UDP通信的示例詳解的文章就介紹到這了,更多相關(guān)C# TCP UDP通信內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C# winform點(diǎn)擊生成二維碼實(shí)例代碼

    C# winform點(diǎn)擊生成二維碼實(shí)例代碼

    這篇文章主要介紹了 C# winform點(diǎn)擊生成二維碼實(shí)例代碼,需要的朋友可以參考下
    2017-04-04
  • Unity實(shí)現(xiàn)物體沿自身的任意軸向旋轉(zhuǎn)

    Unity實(shí)現(xiàn)物體沿自身的任意軸向旋轉(zhuǎn)

    這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)物體沿自身的任意軸向旋轉(zhuǎn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-01-01
  • C#中使用async和await實(shí)現(xiàn)異步Udp通訊的示例代碼

    C#中使用async和await實(shí)現(xiàn)異步Udp通訊的示例代碼

    本文主要介紹了C#中使用async和await實(shí)現(xiàn)異步Udp通訊的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • C#判斷一個(gè)矩陣是否為對稱矩陣及反稱矩陣的方法

    C#判斷一個(gè)矩陣是否為對稱矩陣及反稱矩陣的方法

    這篇文章主要介紹了C#判斷一個(gè)矩陣是否為對稱矩陣及反稱矩陣的方法,涉及C#矩陣遍歷及檢查等相關(guān)運(yùn)算技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-08-08
  • C#生成互不相同隨機(jī)數(shù)的實(shí)現(xiàn)方法

    C#生成互不相同隨機(jī)數(shù)的實(shí)現(xiàn)方法

    這篇文章主要介紹了C#生成互不相同隨機(jī)數(shù)的實(shí)現(xiàn)方法,文中詳細(xì)描述了C#生成互不相同隨機(jī)數(shù)的各個(gè)步驟及所用到的函數(shù),非常具有借鑒價(jià)值,需要的朋友可以參考下
    2014-09-09
  • C# Volatile的具體使用

    C# Volatile的具體使用

    本文主要介紹了C# Volatile的具體使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C#異步編程之a(chǎn)sync/await詳解

    C#異步編程之a(chǎn)sync/await詳解

    異步這個(gè)概念在不同語境下有不同的解釋,不同的編程語言有不同異步編程方法,在C#語言中,常常使用async/await等關(guān)鍵字,和Task等類來實(shí)現(xiàn)異步編程。本文就來和大家聊聊async與await吧
    2023-03-03
  • C#實(shí)現(xiàn)通過winmm.dll控制聲音播放的方法

    C#實(shí)現(xiàn)通過winmm.dll控制聲音播放的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)通過winmm.dll控制聲音播放的方法,很實(shí)用的功能,需要的朋友可以參考下
    2014-08-08
  • 如何在C#項(xiàng)目中鏈接一個(gè)文件夾下的所有文件詳解

    如何在C#項(xiàng)目中鏈接一個(gè)文件夾下的所有文件詳解

    很多時(shí)候我們需要獲取一個(gè)結(jié)構(gòu)未知的文件夾下所有的文件或是指定類型的所有文件,下面這篇文章主要給大家介紹了關(guān)于如何在C#項(xiàng)目中鏈接一個(gè)文件夾下的所有文件,需要的朋友可以參考下
    2023-02-02
  • C#自定義控件指示燈效果

    C#自定義控件指示燈效果

    在C#中實(shí)現(xiàn)一個(gè)指示燈控件,可以通過GDI+技術(shù)繪制,首先使用Pen對象繪制外環(huán),然后用SolidBrush對象填充內(nèi)圓,通過RectangleF定義繪制和填充的邊界,控件的屬性包括顏色、間隙、外環(huán)寬度等,本文給大家介紹C#自定義控件指示燈效果,感興趣的朋友跟隨小編一起看看吧
    2024-09-09

最新評論

手机| 天等县| 资溪县| 邵阳市| 长宁县| 潞城市| 健康| 科技| 双柏县| 海丰县| 淄博市| 金坛市| 洪泽县| 项城市| 通化市| 盐源县| 峡江县| 怀远县| 喀什市| 陕西省| 正阳县| 类乌齐县| 华宁县| 洛宁县| 乌拉特后旗| 凤翔县| 儋州市| 都江堰市| 五寨县| 灵丘县| 建平县| 巴彦淖尔市| 大同县| 郑州市| 上思县| 茶陵县| 四川省| 全州县| 镶黄旗| 泊头市| 江津市|