C#中简单Socket编程

C#中简单Socket编程

Socket分为面向连接的套接字(TCP套接字)和面向消息的套接字(UDP 套接字)。我们平时的网络编程是对Socket进行操作。

接下来,我用C#语言来进行简单的TCP通信和UDP通信。

一、TCP通信

新建项目SocketTest,首先添加TCP通信的客户端代码,如下:

byte[]data = new byte[1024];
            Socket ClientSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);
            Console.WriteLine("Please write Server IPAdress:");
            string IPAdress = Console.ReadLine();
            Console.WriteLine();
            Console.Write("Please Write Server Port:");
            int nPort = Convert.ToInt32(Console.ReadLine());
            IPEndPoint IP = new IPEndPoint(IPAddress.Parse(IPAdress),nPort);
            try
            {
                ClientSocket.Connect(IP);
            }
            catch (SocketException e)
            {
                Console.WriteLine("Can Not Connet Server!");
                Console.WriteLine(e.ToString());
                return;
            }
            int nRetByte = ClientSocket.Receive(data);
            string strData = Encoding.ASCII.GetString(data,0, nRetByte);
            Console.WriteLine(strData);
            while (true)
            {
                string strInput = Console.ReadLine();
                if (strInput == "exit")
                    break;
                String strSay = " Client Say:"; 
                ClientSocket.Send(Encoding.ASCII.GetBytes(strSay + strInput));
                data = new byte[1024];
                nRetByte = ClientSocket.Receive(data);
                strData = Encoding.ASCII.GetString(data, 0, nRetByte);
                Console.WriteLine(strData);
            }
            Console.WriteLine("DisConnect From Server");
            ClientSocket.Shutdown(SocketShutdown.Both);
            ClientSocket.Close();

客户端套接字通信过程是:第一步:调用Socket类创建套接字。第二步:调用Connect()函数连接服务器。

TCP通信服务端代码如下:

 // 返回收到的字节数
            int nRetByte;
            byte[] data = new byte[1024];
            // IPEndPoint 将网络终结点表示为IP地址和端口号
            // IPAddress 提供网络协议IP地址
            IPEndPoint IPep = new IPEndPoint(IPAddress.Any,9050);
            // 实现 Berkeley套接字接口
            // AddressFamily:指定Socket类实例可以使用的寻址方案;
            // InterNetwork:IPV4版本的地址
            // SocketType:套集字类型;Stream:基于TCP的字节流类型
            // ProtocolType:协议的类型
            Socket newSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
            // 使Socket与一个本地终结点相连
            newSocket.Bind(IPep);
            // 使Socket与处于监听状态
            newSocket.Listen(10);
            Console.WriteLine("Wait for a Client");
            // 为新建连接创建新的Socket
            Socket ClientSocket = newSocket.Accept();
            // RemoteEndPoint:获取远程终结点
            IPEndPoint ClientTip = (IPEndPoint)ClientSocket.RemoteEndPoint;
            Console.WriteLine("Connect with Client:"+ ClientTip.Address + "at Port:"+ ClientTip.Port);
            string strWelcome = "Welcome to Server,You Can Send Data To Server";
            // 获取ASCII字符集的编码
            // GetBytes将指定字符串中所有的字符编码为一个字节序列
            data = Encoding.ASCII.GetBytes(strWelcome);
            // 将数据发送到Socket
            ClientSocket.Send(data);
            while (true)
            {
                data = new byte[1024];
                // 从绑定的套接字接受数据,将数据存入接受缓冲区
                nRetByte = ClientSocket.Receive(data);
                Console.WriteLine("Receive Data from Client, Data Size is {0} Bit",nRetByte);
                if (nRetByte == 0)
                    break;
                Console.WriteLine(Encoding.ASCII.GetString(data,0,nRetByte));

                string strInput = Console.ReadLine();
                if (strInput == "exit")
                    break;

                String strSay = "Server Say:";
                ClientSocket.Send(Encoding.ASCII.GetBytes(strSay + strInput));
                Console.WriteLine(strInput);
            }
            Console.WriteLine("DisConnect from ClientAddress",ClientTip.Address);
            ClientSocket.Close();
            newSocket.Close();

TCP通信服务端的通信过程是:第一步调用Socket创建套接字。第二步:调用Bind()函数将套接字绑定到指定的IP地址和端口号。第三步:调用Listen()函数监听套接字。第四步:调用Accept()函数等待客户端连接。上述代码执行结果如下:

Snipaste_2024-07-09_23-13-02

这个测试使用本地回环地址127.0.0.1。

二、UDP通信

UDP通信是面向消息的通信方式。它具有快速不可靠的特点。UDP通信中客户端的过程:

第一步:创建套接字。第二步调用connect函数连接服务器(这一步是可选的,可以写可以不写)。具体代码如下:

 byte[] data = new byte[1024];
            string strInput, strData;
            // 定义一个源IP地址
            // Parse:IP地址字符串转换为IPAdress实例
            IPEndPoint ClientIP = new IPEndPoint(IPAddress.Parse("127.0.0.1"),9050);
            // 定义一个基于UDP协议的Socket
            Socket ClientSocket = new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
            string strWelcome = "Hello are you Here?";
            data = Encoding.ASCII.GetBytes(strWelcome);
            // 向服务器发送指定字节的数据
            ClientSocket.SendTo(data,data.Length, SocketFlags.None,ClientIP);
            IPEndPoint IPSender = new IPEndPoint(IPAddress.Any,0);
            EndPoint IPRemote = (EndPoint)IPSender;
            data = new byte[1024];
            int nRevByte = ClientSocket.ReceiveFrom(data,ref IPRemote);
            Console.WriteLine("Receive Data From Server:{0}", IPRemote.ToString());
            Console.WriteLine(Encoding.ASCII.GetString(data,0, nRevByte));
            while (true)
            {
                // 从标准输入流中读取下一行字符
                strInput = Console.ReadLine();
                if(strInput=="exit")
                    break;
                // 将从控制台中获取的数据发送到服务器端,并且接收服务器端发回的数据
                ClientSocket.SendTo(Encoding.ASCII.GetBytes(strInput), IPRemote);
                data = new byte[1024];
                nRevByte= ClientSocket.ReceiveFrom(data, ref IPRemote);
                strData= Encoding.ASCII.GetString(data,0, nRevByte);
                Console.WriteLine(strData);
            }
            Console.WriteLine("StopClient");
            ClientSocket.Close();

UDP通信服务器端通信过程:

第一步:创建套接字。第二步:将套接字绑定到指定IP地址和端口号。第三步:接收客户端的数据。具体代码如下:

int nRecvByte;
            byte[] data = new byte[1024];
            // 定义一个网络端点
            IPEndPoint IPAdress = new IPEndPoint(IPAddress.Any,9050);
            // 定义一个数据报类型的Socket
            // SocketType.Dgram:使用数据报协议
            // ProtocolType:UDP协议
            Socket ClientSocket = new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
            // Socket与本地的终端结点绑定
            ClientSocket.Bind(IPAdress);
            Console.WriteLine("Wait For a Client!");
            // 定义一个要发送的IP地址
            IPEndPoint Sender = new IPEndPoint(IPAddress.Any,0);
            EndPoint IPRemote = (IPEndPoint)Sender;
            // 接受数据报并存储源终结点
            nRecvByte = ClientSocket.ReceiveFrom(data,SocketFlags.None,ref IPRemote);
            Console.WriteLine("Message Receive From:{0}:", IPRemote.ToString());
            Console.WriteLine(Encoding.ASCII.GetString(data,0,nRecvByte));
            string strWelcome = "Welcome to My Test Server!";
            data = Encoding.ASCII.GetBytes(strWelcome);
            ClientSocket.SendTo(data,SocketFlags.None,IPRemote);
            while (true)
            {
                //接收客户端的数据并且发回 
                data = new byte[1024];
                nRecvByte = ClientSocket.ReceiveFrom(data,ref IPRemote);
                Console.WriteLine(Encoding.ASCII.GetString(data,0, nRecvByte));
                ClientSocket.SendTo(data,IPRemote);
            }

UDP通信效果如下:

Snipaste_2024-07-09_23-31-17
好了,今天就介绍到这里。欢迎大家一起交流。源码:SocketTest

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

6.MkDocs附录

安装插件 在 MkDocs 中,插件通常是通过 pip​ 工具安装的。你可以使用以下步骤来安装和配置 MkDocs 插件。 1.使用 pip​ 命令安装你需要的插件。例如 pip install pymdown-extensions‍ 2.更新 mkdocs.yml​ 文件。 ‍ 3.使用 mkdocs serve​ 命令本地预览你…

H265码率解析

概述 H.265技术的应用 编码技术主要运用于视频播放设备、软件应用以及拍摄、录制视频的设备。人们最熟悉的莫过于PPS网络视频播放器。在PC屏客户端产品上面,PPS已经于2013年初推出了基于H.265标准的高清视频,并命名“臻高清”为自己的高清品牌。同时 P…

mirthConnect 常用示例和语法整理

mirthConnect 常用示例和语法整理 1、jolt json常用语法 https://please.blog.csdn.net/article/details/140137463 2、常用方法 2.1 WinningDateUtils 所有的时间工具在WinningDateUtils里面 获取当前时间:var nowStrWinningDateUtils.getStandardNowStr()获取…

JVM是如何创建一个对象的?

哈喽,大家好🎉,我是世杰。 本文我为大家介绍面试官经常考察的**「Java对象创建流程」** 照例在开头留一些面试考察内容~~ 面试连环call Java对象创建的流程是什么样?JVM执行new关键字时都有哪些操作?JVM在频繁创建对象时,如何…

The First项目报告:引领L2解决方案新纪元的模块化协议AltLayer

在区块链演进中,可扩展性与定制化成为开发者核心诉求。ZK Rollups与Optimistic Rollups虽显著提升以太坊等区块链性能,却面临访问性、定制难、中心化风险及流动性分散等挑战。AltLayer以Rollups-as-a-Service创新模式,赋予开发者直接管理roll…

爆破器材期刊

《爆破器材》简介   《爆破器材》自1958年创刊以来,深受广大读者喜爱,是中国兵工学会主办的中央级技术刊物,在国内外公开发行,近几年已发行到10个国家和地区。《爆破器材》杂志被美国著名检索机构《化学文摘》(CA&a…

【Linux】System V信号量详解以及semget()、semctl()和semop()函数讲解

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …

2018-2022 年份微博签到数据集

前阵子接到一个实验室老师的需求,采集五年前(2024-52019)过年前后的北京微博签到数据。 前两年采集的深圳签到数据是 2022 年是当年的尚可,这次虽然时间跨度只有两个月,但是由于时间太过久远,但是颇费了一…

JAVA从入门到精通之入门初阶(一)

1. 认识变量 一、 首先变量名要遵循如下命名规则: 1. 变量名只能由字母、数字和下划线组成 2. 变量名必须以字母或下划线开头 3. 变量名大小写敏感 4. 变量名不能使用关键字,如const、static等 5. 变量名应具有描述性,以便于代码的可读性…

秋招突击——7/9——复习{Java实现——LRU,Java实现——搜索插入位置}——新作{二分查找——搜索二维矩阵}

文章目录 引言复习Java实现——LRU缓存对照实现 Java实现——搜索插入位置java实现知识补充 新作搜索二维矩阵个人实现参考实现 总结 引言 以后都要向使用Java刷算法进行过滤了,所以今天主要是复习为主,复习两道之前做过的题目,然后做两道新…

基于Java Web的考编论坛网站的设计与实现+lw+源码+讲解+调试+视频演示

第3章 系统分析 用户的需求以及与本系统相似的在市场上存在的其它系统可以作为系统分析中参考的资料,分析人员可以根据这些信息确定出本系统具备的功能,分析出本系统具备的性能等内容。 3.1可行性分析 尽管系统是根据用户的要求进行制作,但…

Springboot项目实训--day2

今天学习的是idea和MySQL的连接,以及一些基本的增删改查的功能实现。 一、软件下载 昨天下载了idea,今天要是西安它们的连接,就需要再下载MySQL,我的MySQL是前面几个学期别人帮忙下载的,所以具体的操作步骤我也不清楚…

Java并发关键字

并发关键字 关键字: synchronized详解关键字: volatile详解关键字: final详解 # Synchronized可以作用在哪里? 对象锁方法锁类锁 # Synchronized本质上是通过什么保证线程安全的? 加锁和释放锁的原理 深入JVM看字节码,创建如下的代码: public cl…

基于Java的科大讯飞大模型API调用实现

写在前面:因为现在自己实习的公司新拓展的一个业务是结合AI的低代码平台,我负责后端的开发,之前一直都是直接使用gpt或者文心一言等ui界面来直接使用大模型,从来没有自己调接口过,所以本文记录一下自己第一次使用大模型…

vue子组件调用父组件方法

父组件 页面<popoverss ref"pop" :goodspop"goodspop"></popoverss>子组件components: {"popoverss": () > import(../comm/popover.vue)},方法goodspop(e){console.log(e"----")return 9999;},子组件 方法props:[go…

理解点对点协议:构建高效网络通信

在通信线路质量较差的年代&#xff0c;能够实现可靠传输的高级数据链路控制&#xff08;High-level Data Link Control, HDLC&#xff09;协议曾是比较流行的数据链路层协议。HDLC是一个较复杂的协议&#xff0c;实现了滑动窗口协议&#xff0c;并支持点对点和点对多点两种连接…

单对以太网:工业4.0时代的通信革命

单对以太网连接器概述 单对以太网&#xff08;Single Pair Ethernet&#xff0c;简称SPE&#xff09;是一种新兴的以太网技术&#xff0c;它通过一对双绞线实现数据传输&#xff0c;支持PoDL&#xff08;Power over Data Line&#xff09;技术&#xff0c;为终端设备提供电力供…

Python | Leetcode Python题解之第225题用队列实现栈

题目&#xff1a; 题解&#xff1a; class MyStack:def __init__(self):"""Initialize your data structure here."""self.queue collections.deque()def push(self, x: int) -> None:"""Push element x onto stack."&…

基于单片机的温湿度感应智能晾衣杆系统设计

&#xff3b;摘 要&#xff3d; 本设计拟开发一种湿度感应智能晾衣杆系统 &#xff0c; 此新型晾衣杆是以单片机为主控芯片 来控制的实时检测系统 &#xff0e; 该系统使用 DHT11 温湿度传感器来检测大气的温湿度 &#xff0c; 然后通过单 片机处理信息来控制 28BYJ &…

Python不使用元类的ORM实现

不使用元类的简单ORM实现 在 Python 中&#xff0c;ORM&#xff08;Object-Relational Mapping&#xff09;是一种将对象和数据库之间的映射关系进行转换的技术&#xff0c;使得通过面向对象的方式来操作数据库更加方便。通常&#xff0c;我们使用元类&#xff08;metaclass&a…