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");// 为新建连接创建新的SocketSocket 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);// 将数据发送到SocketClientSocket.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()函数等待客户端连接。上述代码执行结果如下:

这个测试使用本地回环地址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协议的SocketSocket 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通信效果如下:

好了,今天就介绍到这里。欢迎大家一起交流。源码:SocketTest
相关文章:
C#中简单Socket编程
C#中简单Socket编程 Socket分为面向连接的套接字(TCP套接字)和面向消息的套接字(UDP 套接字)。我们平时的网络编程是对Socket进行操作。 接下来,我用C#语言来进行简单的TCP通信和UDP通信。 一、TCP通信 新建项目SocketTest,首先添加TCP通信的客户端代…...
UNIAPP_ReferenceError: TextEncoder is not defined 解决
错误信息 1、安装text-decoding npm install text-decoding2、main.js import { TextEncoder, TextDecoder } from text-decoding global.TextEncoder TextEncoder global.TextDecoder TextDecoder...
科普文:微服务技术栈梳理
概叙 如上两图所示,微服务架构下,需要的组件很多,上面中也并未列全。下面将梳理一下国内微服务架构下,用到的技术栈,仅供参考。 科普文:12种常见的软件架构-CSDN博客 没有最好的架构,只有最适…...
如何使用HTML和JavaScript读取文件夹中的所有图片并显示RGB范围
如何使用HTML和JavaScript读取文件夹中的所有图片并显示RGB范围 在这篇博客中,我将介绍如何使用HTML和JavaScript读取文件夹中的所有图片,并显示这些图片以及它们的RGB范围。这个项目使用现代浏览器提供的<input type"file" webkitdirecto…...
PDF公式转Latex
文章目录 摘要数据集 UniMER介绍下载链接 LaTeX-OCRUniMERNet安装UniMER 用的数据集介绍下载链接 PDF-Extract-Kit整体介绍效果展示评测指标布局检测公式检测公式识别 使用教程环境安装参考[模型下载](models/README.md)下载所需模型权重 在Windows上运行在macOS上运行运行提取…...
excel 百分位函数 学习
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、函数说明PERCENTILE 函数PERCENTILE.inc 函数PERCENTILE.exc 函数QUARTILE.EXC 函数 二、使用步骤总结 前言 excel 百分位函数 Excel提供了几个函数用于…...
(十一) Docker compose 部署 Mysql 和 其它容器
文章目录 1、前言1.1、部署 MySQL 容器的 3 种类型1.2、M2芯片类型问题 2、具体实现2.1、单独部署 mysql 供宿主机访问2.1.1、文件夹结构2.1.2、docker-compose.yml 内容2.1.3、运行 2.2、单独部署 mysql 容器供其它容器访问(以 apollo 为例)2.2.1、文件…...
提高项目透明度:有效的跟踪软件
国内外主流的10款项目进度跟踪软件对比:PingCode、Worktile、Teambition、Tower、Asana、Trello、Jira、ClickUp、Notion、Liquid Planner。 在项目管理中,确保进度跟踪的准确性与效率是每位项目经理面临的主要挑战之一。选用合适的项目进度跟踪软件不仅…...
大模型生成人物关系思维导图的实战教程
大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…...
精通 mysqldumpslow:深度分析 MySQL 慢查询日志
引言 在数据库管理与优化的领域中,慢查询日志是识别性能瓶颈的金矿。mysqldumpslow 工具是挖掘这座金矿的利器,它帮助我们分析 MySQL 慢查询日志并提取关键信息。本文将详细介绍 mysqldumpslow 的核心选项,并通过实例展示如何使用这些选项来…...
C# Winform之propertyGrid控件分组后排序功能
在 WinForms 的 PropertyGrid 控件中,你可以通过多种方式对属性进行排序,包括按类别(Category)排序以及按属性名称排序。默认情况下,PropertyGrid 控件会根据 [Category] 和 [DisplayName] 属性装饰器对属性进行分组和…...
Java基础(十九):集合框架
目录 一、Java集合框架体系二、Collection接口及方法1、添加2、判断3、删除4、其它 三、Iterator(迭代器)接口1、Iterator接口2、迭代器的执行原理3、foreach循环 四、Collection子接口1:List1、List接口特点2、List接口方法3、List接口主要实现类:Array…...
execute_script与JS
JavaScript简称JS,有的测试场景需要JS脚本辅助完成Selenium无法做到的测试工作。webdriver提供了execute_script()方法调用JS代码。execute_script()可以在当前窗口/框架中执行JS脚本,并返回结果。可以使用它操作DOM元素、获取元素属性、执行异步操作等。…...
访问 Postman OAuth 2.0 授权的最佳实践
OAuth 2.0 代表了 web 安全协议的发展,便于在多个平台上进行授权服务,同时避免暴露用户凭据。它提供了一种安全的方式,让用户可以授权应用程序访问服务。 在 Postman 中开始使用 OAuth 2.0 Postman 是一个流行的API客户端,支持 …...
《BASeg: Boundary aware semantic segmentation for autonomous driving》论文解读
期刊:Neural Networks | Journal | ScienceDirect.com by Elsevier 年份:2023 代码:https://github.com/Lature-Yang/BASeg 摘要 语义分割是自动驾驶领域街道理解任务的重要组成部分。现有的各种方法要么专注于通过聚合全局或多尺度上下文…...
高效利用iCloud指南
高效利用iCloud的指南主要包括以下几个方面: 一、注册与登录 创建Apple ID: 如果尚未拥有Apple ID,可以在苹果官网或iOS设备的设置中创建。Apple ID是访问iCloud服务的前提。登录iCloud: 在苹果设备上,进入“设置”应…...
【MySQL】常见的MySQL日志都有什么用?
MySQL日志的内容非常重要,面试中经常会被问到。同时,掌握日志相关的知识也有利于我们理解MySQL 底层原理,必要时帮助我们排查解决问题。 MySQL中常见的日志类型主要有下面几类(针对的是InnoDB 存储引擎): 错误日志(error log):对 MySQL 的启…...
IDEA社区版使用Maven archetype 创建Spring boot 项目
1.新建new project 2.选择Maven Archetype 3.命名name 4.选择存储地址 5.选择jdk版本 6.Archetype使用webapp 7.create创建项目 创建好长这样。 检查一下自己的Maven是否是自己的。 没问题的话就开始增添java包。 [有的人连resources包也没有,那就需要自己添…...
C/C++ list模拟
模拟准备 避免和库冲突,自己定义一个命名空间 namespace yx {template<class T>struct ListNode{ListNode<T>* _next;ListNode<T>* _prev;T _data;};template<class T>class list{typedef ListNode<T> Node;public:private:Node* _…...
android studio开发
Kotlin 编程简介 | Android Basics Compose - First Android app | Android Developers (google.cn) 这是官网的教程,实现试一下。 之后进入课程 您的第一个 Kotlin 程序 (google.cn) 程序可以被视为一系列指示计算机或设备执行某项操作的指令,...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...
macOS 终端智能代理检测
🧠 终端智能代理检测:自动判断是否需要设置代理访问 GitHub 在开发中,使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新,例如: fatal: unable to access https://github.com/ohmyzsh/oh…...
麒麟系统使用-进行.NET开发
文章目录 前言一、搭建dotnet环境1.获取相关资源2.配置dotnet 二、使用dotnet三、其他说明总结 前言 麒麟系统的内核是基于linux的,如果需要进行.NET开发,则需要安装特定的应用。由于NET Framework 是仅适用于 Windows 版本的 .NET,所以要进…...
