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

news2024/11/24 11:48:09

 

        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连接节点ipEndPint
            udpServer.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)
        {
            // TCP
            TCP 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();

            // UDP
            UDP 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.coloradmin.cn/o/1038053.html

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

相关文章

【腾讯云国际站】CDN内容分发网络特性介绍

为什么使用腾讯云国际站 CDN 内容分发网络? 当用户直接访问源站中的静态内容时,可能面临的体验问题: 客户离服务器越远,访问速度越慢。客户数量越多,网络带宽费用越高。跨境用户访问体验较差。 腾讯云国际站CDN 如何改…

yum和vim工具的使用

目录 yum工具的使用 yum下载原理 软件的查找&下载&删除操作 查找lrzsz软件(文件上传或者下载软件) 下载lrzsz软件 删除lrzsz软件 vim工具的使用 vim命令模式 命令模式与光标相关的快捷键: 插入模式 底行模式 在本次的博客当中我们主要…

C#/Unity3D 单例模板(单例属性模板)

C# 单例单例属性 不做过多解释&#xff0c;非面向大众 using System; namespace EasyAVG {public static class SingletonProperty<T> where T : class{private static readonly object locker new object();private volatile static T instance null;public static…

一篇文章成为递归大神:MySQL递归查询(with recursive)

理论原理 1、MySQL with Recursive是什么&#xff1f; MySQL with Recursive是一种基于递归思想的MySQL查询方式&#xff0c;可以实现对数据的递归查询和处理&#xff0c;返回符合条件的数据。在MySQL 8.0版本中&#xff0c;该功能被正式引入。 2、MySQL with Recursive有什么…

【100天精通Python】Day65:Python可视化_Matplotlib3D绘图mplot3d,绘制3D散点图、3D线图和3D条形图,示例+代码

1 mpl_toolkits.mplot3d 功能介绍 mpl_toolkits.mplot3d 是 Matplotlib 库中的一个子模块&#xff0c;用于绘制和可视化三维图形&#xff0c;包括三维散点图、曲面图、线图等。它提供了丰富的功能来创建和定制三维图形。以下是 mpl_toolkits.mplot3d 的主要功能和功能简介&am…

xxe攻击(XML外部实体)

1.定义 XML用于标记电子文件使其具有结构性的标记语言&#xff0c;可以用来标记数据、定义数据类型&#xff0c;是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义&#xff08;可选&#xff09;、文档元素。 http://www.w3school.com.…

Spring学习笔记9 SpringIOC注解式开发

Spring学习笔记8 Bean的循环依赖问题_biubiubiu0706的博客-CSDN博客 注解的存在主要是为了简化XML的配置.Spring6倡导全注解式开发 回顾下 注解怎么定义,注解中的属性怎么定义 注解怎么使用 通过反射机制怎么读取注解 注解的自定义 注解的使用 通过反射机制怎么读取注解 I…

顺序表的实现和练习

杂谈&#xff1a; 有些数据结构&#xff08;C语言实现&#xff09;的教材/教程中会使用C中引用的语法&#xff0c;引用确实在形式上比指针简洁&#xff0c;这样做无非是为了避免后续对二级指针的使用。 我认为既然使用C语言实现数据结构&#xff0c;那么指针就不应该是门槛。…

【动手学深度学习-Pytorch版】序列到序列的学习(包含NLP常用的Mask技巧)

序言 这一节是对于“编码器-解码器”模型的实际应用&#xff0c;编码器和解码器架构可以使用长度可变的序列作为输入&#xff0c;并将其转换为固定形状的隐状态&#xff08;编码器实现&#xff09;。本小节将使用“fra-eng”数据集&#xff08;这也是《动手学习深度学习-Pytor…

[论文分享] How to Better Utilize Code Graphs in Semantic Code Search?

How to Better Utilize Code Graphs in Semantic Code Search? [ESEC/FSE 2022] 语义代码搜索极大地促进了软件的重用&#xff0c;使用户能够找到与用户指定的自然语言查询高度匹配的代码片段。由于代码图(如控制流图和程序依赖图)丰富的表达能力&#xff0c;两种主流的研究工…

【Gradle-9】Gradle插件发布指南

1、前言 不管是在公司内部&#xff0c;还是开源&#xff0c;Gradle插件发布都是一项必备的技能&#xff0c;本文主要介绍本地发布和远端发布两种方式。 2、本地发布 2.1、添加依赖 在plugin>build.gradle文件中&#xff08;插件的项目&#xff09;先依赖一个maven发布的…

分布式搜索引擎Elasticsearch

一、Elasticsearch介绍 1.Elasticsearch产生背景 大数据量的检索NoSql: not only sql,泛指非关系型的数据库Nginx的7层负载均衡和4层负载均衡2.Elasticsearch是什么 一个基于Lucene的分布式搜索和分析引擎,一个开源的高扩展的分布式全文检索引擎 Elasticsearch使用Java开发…

零基础也能制作小说推文视频,输入文案就能制作推文短视频

小说推文视频一直是各类写手们追捧的创作方式之一&#xff0c;而如何制作出优质、吸引人的小说推文视频成了许多人关注的焦点。幸运的是&#xff0c;现在有了一款名为推文视频制作神器&#xff0c;让制作小说推文视频变得轻松简单。 这款小说推文视频神器的功能十分强大&#…

山西电力市场日前价格预测【2023-09-25】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-09-25&#xff09;山西电力市场全天平均日前电价为442.30元/MWh。其中&#xff0c;最高日前电价为720.46元/MWh&#xff0c;预计出现在19: 00。最低日前电价为276.06元/MWh&#xff0c;预计…

AUTOSAR 多核操作系统时序监控系统设计

AUTOSAR 多核操作系统时序监控系统设计 0 引言1 AUTOSAR 介绍1.1 AUTOSAR 诞生1.3 AUTOSAR 架构 2 时序监控系统软硬件介绍2.1 硬件部分2.2 软件部分 3 时序监控系统设计3.1 监控系统整体设计3.2 监控数据获取3.3 监控数据存储3.4 监控数据处理 3.5 还原运行时序5 推动 5G工业互…

3D点云目标检测:Centerformer训练waymo数据集

一、环境准备 项目地址:centerformer 1.0、基础环境 python 3.8.0 torch 1.9.1cu111 waymo-open-dataset-tf-2-6-0 1.4.9 spconv 1.2.1 其余按照requirement.txt里安装就行 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt由于我本人是在…

uniapp、vue实现滑动拼图验证码

uniapp、vue实现滑动拼图验证码 实际开发工作中&#xff0c;在登陆的时候需要短信验证码&#xff0c;但容易引起爬虫行为&#xff0c;需要用到反爬虫验证码&#xff0c;今天介绍一下拼图验证码&#xff0c;解决验证码反爬虫中的滑动验证码反爬虫。滑动拼图验证码是在滑块验证码…

QLineEdit设置数据的输入范围QIntValidator和QDoubleValidator

在日常开发过程中QLineEdit作为输入框&#xff0c;有时要限制输入的内容&#xff0c;比哪&#xff0c;考试分数为0-100&#xff0c;这个时候就使用QIntValidator作为限制范围&#xff0c;而如何输入的是带小数的呢&#xff0c;那么使用QDoubleValidator可以吗&#xff0c;下面请…

ipad触控笔有必要买原装吗?ipad2023手写笔推荐

目前&#xff0c;在无纸教学、无纸办公的大背景下&#xff0c;电容笔得到了广泛的关注。只是&#xff0c;对于这两支电容笔的不同之处&#xff0c;不少人并不是很清楚。其实这两种电容笔都很好区分&#xff0c;第一种是主动电容笔&#xff0c;也就是我们常用的电容式屏幕&#…

安全生产一张图 安全生产三维地理信息平台

一、 建设目标 易图讯科技是一家专业从事大数据、移动互联网、物联网、三维GIS、AI系统研发&#xff0c;开发了三维电子沙盘、AI三维电子沙盘、WEB三维地球、移动端三维地球、数字武装三维电子沙盘、智慧动员三维电子沙盘、智慧公安三维电子沙盘、智慧安监三维电子沙盘、森林防…