C#中简单Socket编程

news2024/10/1 19:39:20

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

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

相关文章

AWS 云安全性:检测 SSH 暴力攻击

由于开源、低成本、可靠性和灵活性等优势,云基础设施主要由基于linux的机器主导,然而,它们也不能幸免于黑客的攻击,从而影响云的安全性。攻击Linux机器最流行的方法之一是通过SSH通道。 什么是 SSH 安全外壳协议(Sec…

区域特征检测工具的使用

区域特征检测工具的使用 选择区域-》右键-》工具->特征检测

Java核心技术【二十二】Java的I/O流处理:深入文件读写操作、缓冲流、序列化与NIO

Java的I/O流处理:深入文件读写操作、缓冲流、序列化 在Java编程中,I/O流是处理输入输出操作的基础,特别是在文件读写、网络通信等领域。本文将在前文的基础上,进一步探讨缓冲流、序列化以及NIO(New I/O)在…

机器人伦理分析:从扫地机器人到智能伙伴

我发过一个泡泡:机器人和扫地机器人。 意犹未尽,我觉得这是一个值得讨论下去的话题。或者是未来话题 在科技迅猛发展的今天,机器人已经从简单的执行工具演变为能够执行复杂任务的智能实体。特别是在家庭环境中,扫地机器人已经成为…

6.MkDocs附录

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

Python30 使用Gensim库实现Word2Vec对文本进行处理

1.Word2Vec Word2Vec 是一种将词语表示为向量的技术,能够捕捉词语之间的语义关系。它由 Google 的 Tomas Mikolov 等人在 2013 年提出,广泛应用于自然语言处理任务中。其核心概念主要包括: 词嵌入(Word Embeddings) …

如何通过文件分发系统,实现能源电力企业文件的安全分发流转?

随着企业业务的快速发展,能源电力企业会在全国乃至全球,设立总部-分部-办事处/网点等多层级的结构,因此会涉及自动化的文件分发的业务场景。文件分发系统是一种将文件从一个地方自动传输到多个接收者的过程,可以提高工作效率&…

寂静孤独的404页面源码

寂静孤独的404页面源码,灯光闪烁动态效果,源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务器里面,重定向这个界面 寂静孤独的404页面源…

禁用华为小米?微软中国免费送iPhone15

微软中国将禁用华为和小米手机,要求员工必须使用iPhone。如果还没有iPhone,公司直接免费送你全新的iPhone 15! 、 这几天在微软热度最高的话题就是这个免费发iPhone,很多员工,收到公司的通知。因为,登录公司…

24/7/10总结

flex布局 父项常见属性 justify-content:设置主轴上的子元素排列方式 flex-wrap:设置子元素是否换行 align-items:设置侧轴上的子元素的排列方式(单行) 拉伸要把子盒子里的高度给去掉 如果两个align-items都是center并且主轴是y轴就是这种效果…

FullCalendar的使用,react日历组件

1.下载 yarn add fullcalendar/core fullcalendar/react fullcalendar/daygrid 2.运行 import React from react; import FullCalendar from "fullcalendar/react"; import dayGridPlugin from "fullcalendar/daygrid";const ExperimentalSchedule () …

matlab仿真 信道(下)

(内容源自详解MATLAB/SIMULINK 通信系统建模与仿真 刘学勇编著第四章内容,有兴趣的读者请阅读原书) 之前的内容还剩下simulink的仿真过程。 3.simulink中的AWGN模块仿真 系统框图如图所示,TX和RX 模块需要单独实现…

使用esptool工具备份ESP32的固件(从芯片中备份下来固件)

本文以Windows电脑为例 板子为esp32-c3 1下载python 可在官网中下载,此处不进行讲解 使用如下代码查看是否安装了 Python(终端输入) python 2下载esptool 在终端输入如下代码即可下载 使用 pip(推荐): 在你已经安装的 Pyth…

【面试题】正向代理和反向代理的区别?

正向代理(Forward Proxy)和反向代理(Reverse Proxy)是两种常见的代理服务器类型,它们在网络通信中扮演着不同的角色,具有不同的功能和应用场景。 一、正向代理 1. 定义与位置 正向代理是位于客户端和目标…

Python基础知识——(003)

文章目录 P12——11. 保留字和标识符 1. 保留字 2. Python标识符的命名规则(必须遵守) 3. Python标识符的命名规范(建议遵守) P13——12. 变量与常量 变量的语法结构 变量命名应遵循以下几条规则 常量 P14——13. 数值类型…

一键式创建GTest TDD测试平台

适用于C GTest测试平台搭建。直接上python脚本。 #!/usr/bin/env python3 # -*- coding: utf-8 -*-import argparse import os import platform import subprocess from xml.etree import ElementTree as ETdefault_root_path "d:\\test\\UTtest"class DeveloperTe…

leetcode--从中序与后序遍历序列构造二叉树

leeocode地址:从中序与后序遍历序列构造二叉树 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder …

VUE中ECharts提示框tooltip自动切换

目录 前言1导入插件2定义参数3 插件API 前言 使用VUE开发的数据大屏统计,又需要将 echarts的提示框 tooltip 实现自动切换,网上有个很简单的插件(echarts-tooltip-auto-show),使用教程简单分享给大家。 自动每隔几秒切…

2024前端面试真题【JS篇】

DOM DOM:文本对象模型,是HTML和XML文档的编程接口。提供了对文档的结构化的表述,并定义可一种方式可以使从程序中对该结构进行访问,从而改变文档的结构、样式和内容。 DOM操作 创建节点:document.createElement()、do…

数据结构(初阶2.顺序表)

文章目录 一、线性表 二、顺序表 2.1 概念和结构 2.2 分类 2.2.1 静态顺序表 2.2.2 动态顺序表 2.3动态顺序表的实现 1.SeqList.h 2.SeqList.c 打印顺序表 初始化 销毁 增容 尾插 头插 在指定位置之前插入数据 尾删 头删 在指定位置删除数据 3.test.c 一、线性表 线性表&#…