C#__简单使用TCP/UDP发送消息

 

        Socket(套接字、插口)
        TCP和UCP的区别:
        1、基于连接和无连接
        2、对系统资源的要求(TCP较多,UCP少)
        3、UDP程序结构简单
        4、流模式和数据报模式
        5、TCP保证数据正确性和数据先后顺序,UDP可能丢包,且不保证数据到达先后顺序 

 

// 进行前先寻得本机IPv4地址

win + R ——>cmd——>输入ipconfig

 

 // TCP类

    class TCP{// 服务器端套接字(指定的寻址方案的一个实例.IPv4,套接字类型.字节流,支持的协议.TCP)Socket tcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);// 客户端套接字Socket tcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);//Internet 协议 (IP) 地址(IP 地址的字节数组值)IPAddress ipAddress = new IPAddress(new byte[] { 192, 168, 77, 1 });public void TcpServer(){//IP + Port(端口) 地址和端口号,端口号由自己指定,用于链接IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, 0001);tcpServer.Bind(ipEndPoint);  /*将相关联 tcpServer 与本地终结点*/// 侦听tcpServer(挂起的连接队列的最大长度)tcpServer.Listen(20);Console.WriteLine("正在连接客户端……");// 新创建的连接Socket client = tcpServer.Accept();Console.WriteLine("一个客户端链接过来了");// 接收信息byte[] data = new byte[1024];// 将tcpServer数据的按字节存入接收缓冲区(接收到的数据的存储位置)int length = client.Receive(data);//字符编码.获取 UTF-8 格式的编码.将指定字节数组中的一个字节序列解码为一个字符串(包含要解码的字节序列的字节数组,第一个要解码的字节的索引,要解码的字节数)string message = Encoding.UTF8.GetString(data, 0, length);Console.WriteLine("接收到客户端的消息:" + message);// 发送消息,将指定字符串中的所有字符编码为一个字节序列client.Send(Encoding.UTF8.GetBytes("欢迎你的到来"));// 关闭Socket连接和释放所有关联资源client.Close();tcpServer.Close();}public void TcpClient(){//IP + Port(端口),与客户端一致,保证接收IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, 0001);//建立与远程主机的连接(远程设备)tcpClient.Connect(ipEndPoint);Console.WriteLine("链接上了服务器端!");string message = "我上线了";tcpClient.Send(Encoding.UTF8.GetBytes(message));byte[] data = new byte[1024];int length = tcpClient.Receive(data);Console.WriteLine("接收到服务器的信号:" + Encoding.UTF8.GetString(data));tcpClient.Close();}}

// UDP类

    class UDP{Socket udpServer = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);Socket udpClient = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);IPAddress ipAddress = new IPAddress(new byte[] { 192, 168, 77, 1 });public void UdpSer(){IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, 1111);// udpServer连接节点ipEndPintudpServer.Bind(ipEndPoint);// 提供了一个指示服务器必须侦听的所有网络接口上的客户端活动的 IP 地址IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 0);// 标识网络地址,abstrct类EndPoint ep = ipep;byte[] data = new byte[1024];// 接收到数据缓冲区,将存储终结点(数据的存储位置,引用传递(远程服务器))int length = udpServer.ReceiveFrom(data, ref ep);Console.WriteLine("接收到来着UDP客户端的数据:" + Encoding.UTF8.GetString(data, 0, length));udpServer.Close();}public void UdpCnt(){byte[] data = Encoding.UTF8.GetBytes("你好,udp客户端上线了");IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, 1111);udpClient.SendTo(data, ipEndPoint);udpClient.Close();}}

// 主程

        static void Main(string[] args){// TCPTCP server = new TCP();Thread sr = new Thread(server.TcpServer);Thread ct = new Thread(server.TcpClient);sr.Start();ct.Start();Thread.Sleep(1000);sr.Abort();ct.Abort();// UDPUDP udp = new UDP();Thread sUdp = new Thread(udp.UdpSer);Thread cUdp = new Thread(udp.UdpCnt);sUdp.Start();cUdp.Start();Thread.Sleep(1000);cUdp.Abort();sUdp.Abort();}

// 结果

正在连接客户端……
链接上了服务器端!
一个客户端链接过来了
接收到客户端的消息:我上线了
接收到服务器的信号:欢迎你的到来  接收到来着UDP客户端的数据:你好,udp客户端上线了
请按任意键继续. . .

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/86922.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java21虚拟线程实践

文章目录 虚拟线程的使用什么是虚拟线程虚拟线程和协程相同之处:不同之处: 总结 就在前几天,java21正式版发布了,作为继java17之后的又一个长期支持版本 (LTS),为我们带来了很多新的特性,其中我最感兴趣的就…

【线性代数】

0、线性代数的本质往往被淹没在计算的海洋中,无人问津! 1、什么是向量? 向量是带方向的箭头,向量是坐标。 2、向量的线性组合 两个向量不共线,即线性无关;两个向量共线,即线性相关。 两个不…

关于地址存放的例题

unsigned int a 0x1234; unsigned char b *(unsigned char*)&a; 上面代码大端存储和小端存储的值分别是多少? 大端存储的是把高位地址存放在低位地址处,低位存放到高位。小端是高位存放在高位,低位在低位。因为a是整型,所…

GraphQL基础知识与Spring for GraphQL使用教程

文章目录 1、数据类型1.1、标量类型1.2. 高级数据类型 基本操作2、Spring for GraphQL实例2.1、项目目录2.2、数据库表2.3、GraphQL的schema.graphql2.4、Java代码 3、运行效果3.1、添加用户3.2、添加日志3.3、查询所有日志3.4、查询指定用户日志3.5、数据订阅 4、总结 GraphQL…

C 语言简单入门

C 语言发展历史|标准 1972年,丹尼斯里奇(Dennis Ritch)和肯汤普逊(Ken Tompson)在贝尔实验室开发 UNIX 操作系统时基于 B 语言设计出 C 语言。 1987年,布莱恩柯林汉(Brian Kernighan&#xff…

数据库基础理论

什么是数据库? 数据:描述事物的符号记录,可以是数字、文字、图形、图像、声音、语言等,数据有多种形式,他们都是可以经过数字化后存入计算机。 数据库:存储数据的仓库,是长期存放在计算机内、…

世界前沿技术发展报告2023《世界信息技术发展报告》(三)量子信息技术

(三)量子信息技术 1. 概述2. 量子计算2.1 阿里巴巴达摩院成功研制两比特量子芯片,单比特操控精度超99.97%2.2 加拿大Xanadu公司开发出可编程光量子计算机2.3 美国英伟达公司为经典-量子混合计算推出开发架构2.4 日本国家自然科学研究所开发出…

SpringBoot实战

ISBN: 978-7-115-43314-5 作者:【美】Craig Walls 译者:丁雪丰 页数:209页 阅读时间:2022-12-27 推荐指数:★★★☆☆ 阅读本书还是要有一定的基础的,如果想要入门级还是不行, 建议入门级可以看…

python+nodejs+php+springboot+vue 法律知识分享科普系统平台

在设计过程中,充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 要想实现法律知…

数字图像基础,数字图像处理中的基础内容(数字图像处理概念 P2)

文章目录 人类视觉系统构造数字图像生成采样和量化像素之间的基本关系 人类视觉系统构造 锥状体:明亮的视野杆状体:微光或暗视野图像成像原理:类似照相机亮度适应现象:人的视觉不能同时在一个范围内工作同时对比现象:…

el-select的某一项选中后显示id

环境: vue3element-plus 今天在使用elementui的下拉组件的时候发现有一个选项在选中后显示的是id.找了会没看到问题,后来想到会不会是没有设置key的原因(之前看到说vue3可以不用设置key),果然加上key就可以了

README

title: “README” createTime: 2022-01-04T20:48:4008:00 updateTime: 2022-01-04T20:48:4008:00 draft: false author: “name” tags: [“shell”] categories: [“hadoop”] description: “测试的” hadoop 相关技术 获取某个application的 日志 yarn logs -application…

变量、因子、缺失值、类型转换、剔除多余变量、随机抽样、用R使用SQL、trim、na.rm=TRUE、数据标准化应用

变量:名义型、有序型、连续型变量 名义型:普通事件类型,如糖尿病I型和糖尿病II型。 有序型:有顺序的事件类型,如一年级、二年级和三年级。 连续型:表示有顺序的数量,如年龄。 因子:…

基于Python+Django的热门旅游景点数据分析系统的设计与实现(源码+lw+部署文档+讲解等)

前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 👇🏻…

C++项目:仿muduo库实现高性能高并发服务器

文章目录 一、实现目标二、前置知识(一)HTTP服务器1.概念 (二)Reactor模型:1.概念2.分类(1)单Reactor单线程:单I/O多路复用业务处理。(2)单Reactor多线程&…

Docker--network命令的用法

原文网址:Docker--network命令的用法_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Docker的network网络命令的用法。 官网网址 docker network | Docker Documentation 命令概述 所有命令 命令名称 说明 docker network connect 将容器连接到网络 dock…

软件设计中常见的设计模式

以下是常见的设计模式,并且给出了应用场景: 工厂模式(Factory Pattern):用于创建对象,隐藏了具体对象的创建细节,客户端只需要通过工厂接口获取对象即可。应用场景包括:当需要根据不…

ultraEdit正则匹配多行(xml用)

在ultraEdit中&#xff0c;我想选取<channel到</channel>之间的多行&#xff08;进行删除&#xff09;。在perl模式下&#xff0c;命令为“<channel[\s\S]?</channel>”。下面是xml文件&#xff1a; <!--This XML file does not appear to have any sty…

Golang结构体按某一成员变量排序

结构体排序使用sort包中的sort.SliceStable() 函数。该函数需要传入一个结构体数组参数和一个匿名函数&#xff08;排序方式&#xff09; e.g. type inte struct {l, r int } //调用排序函数&#xff0c;按inte中l从小到大的方式排序 sort.SliceStable(intes, func(i, j int) …

数据结构 | 顺序表

考虑因素 插入 存储容量够吗 &#xff08;n<list_size&#xff09;插入位置正确吗(i>1&&i<n1)要插入位置后的元素后移&#xff08;循环处理&#xff09;&#xff08;An先移动&#xff09; An-Ai1插入元素表长1 删除 判断是否空&#xff0c;删除位置是否正确元…