C#实现TCP和UDP通信的示例详解

 更新时间:2023年03月01日 08:46:00   作者:微小冷  
这篇文章主要为大家详细介绍了C#实现TCP和UDP通信的相关知识,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解一下

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

从编程的角度出发,TCP和UDP最大的区别是,TCP存在TcpClientTcpLinster两个对象用于信息的传递,二者一发一收,十分完备。而UDP则只有一个类UdpClient,换言之,UDP通信是不分服务端和客户端,通信双方对等。

UDP发送

至少在形式上,UDP比TCP更简单,所以先从UDP讲起。

考虑到通信那肯定是有发有收才行,如果只用C#自己,那么肯定得上个多线程什么的才能跑通。为了避免问题复杂化,故推荐使用这款NetAssist网络助手。

有了这个,只要在C#里写一套发送代码,就可以在NetAssist上看到发送的内容,比较实用。又因为采用顶级语句,导致用下面这区区几行代码就可以完成一次套接字编程的实践,非常划算

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

//由于收发都在本机,所以只用一个IP地址
IPAddress addr = IPAddress.Parse("127.0.0.1");

var ptLocal = new IPEndPoint(addr, 9001);  //本机节点,用于发送
var ptDst = new IPEndPoint(addr, 9002);    //目标节点

var udp = new UdpClient(ptLocal);          //在本地建立udp服务
byte[] buffer = Encoding.UTF8.GetBytes("hello");
udp.Send(buffer, buffer.Length, ptDst);    //将内容发给ptDst

效果为

在网络中,两个电脑要想通信,那么必须要知道彼此的位置,而在网络中描述一个计算机的位置,用的就是IP地址。但光有一个地址还不行,计算机要处理这么多任务,接收这么多服务,在IP地址之外还得有个端口才可以。这种感觉大致相当于,IP是一栋楼,端口就是门牌号。

而127.0.0.1是一个特殊的地址,即主机环回地址,很好理解,就是指向本地的地址,有了这个,就可以自己和自己通信了。

UDP接收

发送和接收看上去是对偶,但难度上完全是两回事,这种感觉就像你给女神发消息,其实很方便,按下发送键就完事儿了。但你等女神的消息,那就比较煎熬,因为你不确定她什么时候会发过来,所以得一直等着。

所以,接收比发送麻烦多了,最起码得有一个死循环,如果对方没消息,就死等。

// 前面的代码和发送代码一样
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);    //将内容发给ptDst
}

其中udp.Receive就起到死等的作用,如果收不到,程序就不执行,最后结果如下

TCP发送

UDP协议的好处是,UdpClient包打天下,既可以发送也可以接收,而发送者和接收者的身份,需要通过端口号来区分。

TCP则不然,TCP本身分为服务端和客户端,服务端在C#中用TcpListener类来实现,观其名而知其义,服务端的作用是监听,相应地客户端TcpClient用于发送。其通信逻辑是,客户端将发送工具和消息内容一起发送给服务端,服务端再用客户端自己的发送工具进行回信。

NetAssist同样提供了TCP的发送和接收功能,为了让C#代码相对简单,这里先选择服务端,即TCP Server,端口选择9002,接下来仍用最短的代码来演示一下C#的TCP发送功能,需要注意客户端和服务端的端口需要统一一下。

// 引用的命名空间还是上面这些
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更高级一点,毕竟TcpListener又称服务端,名义上来说要服务于所有人。

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()根据监控到的信息,返回一个新的客户端对象;c.GetStream()返回一个网络流对象,和其他Stream一样,通过Read方法,可以将二进制数据写入到字节数组中。

效果如下

到此这篇关于C#实现TCP和UDP通信的示例详解的文章就介绍到这了,更多相关C# TCP UDP通信内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C# winform点击生成二维码实例代码

    C# winform点击生成二维码实例代码

    这篇文章主要介绍了 C# winform点击生成二维码实例代码,需要的朋友可以参考下
    2017-04-04
  • Unity实现物体沿自身的任意轴向旋转

    Unity实现物体沿自身的任意轴向旋转

    这篇文章主要为大家详细介绍了Unity实现物体沿自身的任意轴向旋转,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-01-01
  • C#中使用async和await实现异步Udp通讯的示例代码

    C#中使用async和await实现异步Udp通讯的示例代码

    本文主要介绍了C#中使用async和await实现异步Udp通讯的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • C#判断一个矩阵是否为对称矩阵及反称矩阵的方法

    C#判断一个矩阵是否为对称矩阵及反称矩阵的方法

    这篇文章主要介绍了C#判断一个矩阵是否为对称矩阵及反称矩阵的方法,涉及C#矩阵遍历及检查等相关运算技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08
  • C#生成互不相同随机数的实现方法

    C#生成互不相同随机数的实现方法

    这篇文章主要介绍了C#生成互不相同随机数的实现方法,文中详细描述了C#生成互不相同随机数的各个步骤及所用到的函数,非常具有借鉴价值,需要的朋友可以参考下
    2014-09-09
  • C# Volatile的具体使用

    C# Volatile的具体使用

    本文主要介绍了C# Volatile的具体使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • C#异步编程之async/await详解

    C#异步编程之async/await详解

    异步这个概念在不同语境下有不同的解释,不同的编程语言有不同异步编程方法,在C#语言中,常常使用async/await等关键字,和Task等类来实现异步编程。本文就来和大家聊聊async与await吧
    2023-03-03
  • C#实现通过winmm.dll控制声音播放的方法

    C#实现通过winmm.dll控制声音播放的方法

    这篇文章主要介绍了C#实现通过winmm.dll控制声音播放的方法,很实用的功能,需要的朋友可以参考下
    2014-08-08
  • 如何在C#项目中链接一个文件夹下的所有文件详解

    如何在C#项目中链接一个文件夹下的所有文件详解

    很多时候我们需要获取一个结构未知的文件夹下所有的文件或是指定类型的所有文件,下面这篇文章主要给大家介绍了关于如何在C#项目中链接一个文件夹下的所有文件,需要的朋友可以参考下
    2023-02-02
  • C#自定义控件指示灯效果

    C#自定义控件指示灯效果

    在C#中实现一个指示灯控件,可以通过GDI+技术绘制,首先使用Pen对象绘制外环,然后用SolidBrush对象填充内圆,通过RectangleF定义绘制和填充的边界,控件的属性包括颜色、间隙、外环宽度等,本文给大家介绍C#自定义控件指示灯效果,感兴趣的朋友跟随小编一起看看吧
    2024-09-09

最新评论