Socket编程详解(二)核心代码讲解
本文对代码的讲解基于上一篇博客
快速链接
Socket编程详解(一)服务端与客户端的双向对话
小试牛刀1:委托声明的关键字和委托方法使用的方法名是不一样的名称
- 可读性:有时,委托的名称可能描述了它的用途或它在哪里被使用,而方法的名称可能更具体地描述了它的功能。将两者分开可以使代码更具可读性。
- 重用性:同一个方法可以被多个不同的委托使用。如果你有一个通用的方法,它可以被多个不同的操作触发,那么将这些操作定义为不同的委托可能是有意义的。
- 封装性:委托可以封装方法的调用,使你可以在不改变原始方法的情况下更改其调用方式(例如,添加额外的日志记录或错误处理)。
- 事件:在C#中,事件是基于委托的。将事件名称与触发事件的方法名称分开是一种常见的做法,因为事件通常表示某种更高层次的概念(如“数据已更改”或“操作已完成”),而方法可能只是实现这个概念的具体细节。
总的来说,将委托和方法的名称分开并不是必须的,但它可以提供更好的可读性、重用性和封装性。然而,在大多数情况下,重要的是保持它们之间的签名一致,以确保它们可以正确地相互引用和使用。
小试牛刀2:对Main方法的理解
这段代码是C#中Windows Forms应用程序的入口点,通常在Program.cs
文件中找到。我将为你逐步解释这段代码:
-
static void Main()
:
这是C#应用程序的入口点。当你运行一个C#控制台应用程序或Windows Forms应用程序时,Main
方法是首先被调用的。 -
Application.EnableVisualStyles();
:- 这行代码使Windows Forms控件能够使用XP和后续版本的Windows中的视觉样式。这意味着控件将具有与操作系统主题一致的外观和感觉。
- 默认情况下,如果你不调用此方法,Windows Forms控件可能会使用较旧的、不太吸引人的样式。
-
Application.SetCompatibleTextRenderingDefault(false);
:- 这行代码告诉Windows Forms应用程序使用GDI+进行文本渲染,而不是GDI。GDI+是GDI(图形设备接口)的一个增强版本,它提供了更丰富的图形和文本渲染功能。
- 设置此属性的值为
false
通常与EnableVisualStyles
一起使用,以确保文本和图形都以最佳方式呈现。 - 在某些情况下,如果你的应用程序需要兼容旧的Windows版本或特定的文本渲染行为,你可能需要将此值设置为
true
。但在现代Windows Forms应用程序中,通常将其设置为false
。
-
Application.Run(new FrmTCPServer());
:- 这行代码启动Windows Forms应用程序的消息循环,并显示
FrmTCPServer
窗体。 Application.Run
是Windows Forms应用程序的核心。它启动一个消息循环,该循环监听来自操作系统的消息(如鼠标单击或键盘按键),并将这些消息传递给相应的窗体或控件进行处理。- 在这里,你创建了一个新的
FrmTCPServer
窗体实例,并将其传递给Application.Run
方法。这意味着当你运行此应用程序时,FrmTCPServer
窗体将首先被显示。
- 这行代码启动Windows Forms应用程序的消息循环,并显示
简而言之,这段代码设置了Windows Forms应用程序的视觉样式和文本渲染方式,并启动了应用程序,显示FrmTCPServer
窗体。
小试牛刀3:对方法的理解
private void RecMsg(string str) {this.txt_Rcv.AppendText(str+Environment.NewLine);}
在这段代码中,RecMsg
是一个方法(函数),它被设计为接收一个字符串参数 str
。该方法的主要功能是将传入的字符串 str
添加到 txt_Rcv
这个控件(很可能是 Windows Forms 中的 TextBox
控件)的文本末尾,并在其后添加一个换行符。
这里的 Environment.NewLine
是一个静态属性,它返回当前环境的换行符字符串。在 Windows 系统上,这通常是 \r\n
(回车和换行符的组合),而在 Unix 和 Linux 系统上,它通常是 \n
(只有换行符)。
这里是一个简单的解释:
RecMsg
方法被调用时,传入一个字符串str
。- 方法内部,使用
this.txt_Rcv.AppendText
将str
添加到txt_Rcv
控件的当前文本末尾。 - 接着,在
str
的后面添加一个换行符,这是通过Environment.NewLine
实现的。 - 这样,每次调用
RecMsg
方法时,都会在txt_Rcv
控件中看到新添加的一行文本。
如果 txt_Rcv
是一个 TextBox
控件,并且这个 RecMsg
方法是在 Windows Forms 应用程序的某个窗体中定义的,那么这个方法通常会被用于处理接收到的消息,并将这些消息显示在窗体上的文本框中。例如,在 TCP/IP 聊天应用程序中,服务器或客户端可能会调用这个方法来显示从另一端接收到的消息。
小试牛刀4:对监听核心代码的理解
sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress address = IPAddress.Parse(this.txt_IP.Text.Trim());
IPEndPoint endpoint = new IPEndPoint(address, int.Parse(this.txt_Port.Text.Trim()));
1.AddressFamily(地址族)
地址族是一个用来表示IP地址类型的枚举。在您提供的代码中,AddressFamily.InterNetwork
表示的是 IPv4 地址族。这意味着您创建的套接字将用于处理 IPv4 类型的网络地址。
AddressFamily.InterNetwork
: 表示 IPv4 地址族。AddressFamily.InterNetworkV6
: 表示 IPv6 地址族。
2.SocketType(套接字类型)
套接字类型定义了套接字的基本通信特性。在您提供的代码中,SocketType.Stream
表示一个流套接字,它通常用于面向连接的通信,如 TCP。流套接字提供了一种可靠的、基于字节流的通信方式。
SocketType.Stream
: 字节流套接字,通常用于 TCP 通信。SocketType.Dgram
: 数据报套接字,通常用于 UDP 通信。- 还有其他的套接字类型,如
SocketType.Raw
和SocketType.Rdm
,但它们通常用于更底层的网络编程。
3.ProtocolType(协议类型)
协议类型定义了套接字所使用的具体协议。在您提供的代码中,ProtocolType.Tcp
表示使用 TCP 协议。TCP 是一种面向连接的、可靠的、基于字节流的传输层协议。
ProtocolType.Tcp
: 传输控制协议(TCP)。ProtocolType.Udp
: 用户数据报协议(UDP)。- 还有其他协议类型,但 TCP 和 UDP 是最常用的。
4.IPEndPoint
IPEndPoint
是一个表示网络端点的类,它包含了一个 IP 地址和一个端口号。在您提供的代码中,您创建了一个 IPEndPoint
对象,其中 address
是一个 IP 地址(可能是 IPAddress
类型的实例或可以转换为 IPAddress
的字符串),而端口号则是从 txt_Port.Text
(可能是一个文本框控件的内容)中解析出来的整数。
综上所述,您提供的代码创建了一个用于 TCP 通信的 IPv4 套接字,并指定了一个网络端点(IP 地址和端口号)。这样,您就可以使用这个套接字来与指定的 IP 地址和端口上的服务器或客户端进行通信了。
小试牛刀5:对绑定端口号代码的理解
sock.Bind(endpoint);Invoke(myRcvMsg, "服务器开启成功!");MessageBox.Show("开启服务成功!", "打开服务");
1.端口号绑定 (sock.Bind(endpoint);
)
在套接字编程中,Bind
方法用于将套接字与特定的本地地址(IP 地址和端口号)相关联。这告诉操作系统,当有数据到达该 IP 地址和端口时,应该将数据传递给这个套接字。在您提供的代码中,endpoint
是一个 IPEndPoint
对象,它包含了 IP 地址和端口号。sock.Bind(endpoint);
就是将套接字 sock
绑定到这个 endpoint
上。
2.Invoke 方法
在 Windows Forms 应用程序中,如果你尝试在不是由控件创建的线程上直接更新控件(例如,在后台线程中更新 UI),那么你会遇到线程安全问题,并可能导致异常。为了避免这种情况,你可以使用控件的 Invoke
方法来在控件的创建线程上执行代码。
这里 myRcvMsg
应该是一个委托实例,它指向一个方法,该方法接受一个字符串参数(在这里是 "服务器开启成功!"
)。
3.MessageBox.Show 方法
MessageBox.Show
方法用于显示一个消息框。它可以有不同的重载版本,接受不同数量的参数。在您提供的代码中,MessageBox.Show("开启服务成功!", "打开服务");
使用了两个参数:
- 第一个参数
"开启服务成功!"
是要显示的消息文本。 - 第二个参数
"打开服务"
是消息框的标题。
总结起来,您的代码首先绑定套接字到指定的 IP 地址和端口,然后尝试使用 Invoke
方法来更新 UI(尽管这里的具体实现可能不完全正确),最后使用 MessageBox.Show
方法来显示一个消息框。如果您的目的是在 UI 线程上显示消息框,那么通常不需要使用 Invoke
来包装 MessageBox.Show
调用,因为 MessageBox.Show
本身是线程安全的,并且会自动在 UI 线程上执行。
针对这个MessageBox.Show()方法,有个地方会经常用到,就是捕捉异常的时候
根据下面这个代码理解这个方法:
这里是一个catch捕捉异常,此处的MessageBox.Show()方法里面的ex.Message会弹出什么内容呢?是不是MessageBox.Show()方法会根据不同的异常弹出不一样的内容吗?catch(Exception ex) { MessageBox.Show("开启服务失败" + ex.Message, "打开服务"); return; }
在C#中,catch(Exception ex)
语句用于捕获在try
块中抛出的任何异常。当异常被捕获时,ex
(在这里是一个Exception
类型的变量)将包含有关该异常的详细信息。
ex.Message
属性包含了异常的描述性消息,这个消息通常描述了异常发生的原因。这个消息是由抛出异常的代码生成的,可能是一个通用的描述(如“发生了一个未处理的异常”),也可能是一个更具体的描述(如“无法连接到数据库服务器”或“索引超出了数组的范围”)。
在你的catch
块中,MessageBox.Show("开启服务失败" + ex.Message, "打开服务");
这行代码将会弹出一个消息框,标题为“打开服务”,而消息内容为“开启服务失败”后面跟上ex.Message
的内容。
因此,确实,MessageBox.Show()
方法会根据不同的异常弹出不一样的内容,因为ex.Message
的内容会根据抛出的具体异常而变化。
例如,如果抛出的异常是因为网络问题导致的,ex.Message
可能会是类似于“无法连接到远程服务器”这样的消息。那么,用户将会看到一个消息框,内容是“开启服务失败无法连接到远程服务器”,标题是“打开服务”。
如果抛出的异常是因为数组越界,ex.Message
则可能会是“索引超出了数组的范围”,那么用户将会看到一个消息框,内容是“开启服务失败索引超出了数组的范围”,标题是“打开服务”。
小试牛刀6:对socket对象.Listen(10)的理解
在网络编程中,特别是使用TCP/IP套接字(Socket)时,sock.Listen(10);
这行代码表示服务器套接字(sock
)现在准备好开始监听来自客户端的连接请求,并且它有一个“挂起连接队列”的容量大小为10。
这里是这行代码的详细解释:
sock
: 这是一个服务器套接字对象,通常是在创建套接字(使用如Socket
类的构造函数)并绑定到一个特定的IP地址和端口号后得到的。Listen
: 这是Socket
类的一个方法,用于将套接字置于监听模式,以便它可以接受来自客户端的连接请求。10
: 这是传递给Listen
方法的参数,它指定了挂起连接队列的最大长度。挂起连接队列是一个内部数据结构,用于存储来自客户端的连接请求,当服务器太忙而不能立即接受连接时。队列中的每个条目都代表一个尚未被Accept
方法处理的连接请求。
在这个例子中,如果服务器套接字(sock
)同时收到超过10个连接请求,并且它还没有通过Accept
方法接受任何连接,那么第11个及以后的连接请求将会被丢弃或拒绝,直到队列中有空间为止。
注意:仅仅调用Listen
方法并不会使服务器自动接受连接。你需要在一个单独的线程(或使用异步方法)中调用Accept
方法,以便在连接请求到达时进行处理。Accept
方法将从挂起连接队列中取出一个连接请求,并返回一个新的套接字对象,该对象表示与客户端的已建立连接。然后,你可以使用这个新的套接字对象与客户端进行通信。
相关文章:
Socket编程详解(二)核心代码讲解
本文对代码的讲解基于上一篇博客 快速链接 Socket编程详解(一)服务端与客户端的双向对话 小试牛刀1:委托声明的关键字和委托方法使用的方法名是不一样的名称 可读性:有时,委托的名称可能描述了它的用途或它在哪里被…...

(项目实战)聚合支付系统开发环境搭建-基于VMware17安装Centos7.9
1 开发环境介绍 dtpay聚合支付系统和ecard预付卡系统,服务端部署在Linux环境。后续的开发环境,生产环境都是基于Linux进行搭建,系统使用到的相关中间件(RocketMQ,Redis,Nginx等),配置中心Nacos,数据库MySQ…...

Python现在可以在线编程了!
你好,我是郭震 1 在线编程 在线编程好处: 1 无需安装和配置环境: 在线编程平台不需要用户在本地安装任何软件或配置开发环境。这对初学者和那些希望快速上手进行编程的人非常有利。 2 跨平台兼容性: 这些平台可以在任何具有互联网连接的设备上使用&#…...

ThreadPoolExecutor线程池创建线程
线程池介绍 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源&#…...
畅谈GPT-5
前言 ChatGBT(Chat Generative Bidirectional Transformer)是一种基于自然语言处理技术的对话系统,它的出现是人工智能和自然语言处理技术发展的必然趋势。随着技术的更新和进步,GPT也迎来了一代代的更新迭代。 1.GPT的回顾 1.1 GPT-3的介绍 GPT-3(Gen…...

石家庄高校大学智能制造实验室数字孪生可视化系统平台项目验收
智能制造作为未来制造业的发展方向,已成为各国竞相发展的重点领域。石家庄高校大学智能制造实验室积极响应国家发展战略,结合自身优势,决定引进数字孪生技术,构建一个集教学、科研、生产于一体的可视化系统平台。 数字孪生可视化…...

WLAN 4-Way Handshake如何生成GTK?
关于Wi-Fi的加密认证过程,可以参考如下链接,今天我们来理解如何生成GTK。 WLAN数据加密机制_tls加密wifi-CSDN博客 1 GTK GTK(Group Temporal Key)是由AP通过GMK生成,长度为128位,并在四次握手的第三步中…...
Qt/C++模拟鼠标键盘输入
1、控制鼠标移动 (1)Qt方案 QScreen* sc QGuiApplication::primaryScreen(); QCursor* c new QCursor(); int deltaX 10; int deltaY 10; c->setPos(sc, c->pos().x() deltaX, c->pos().y() deltaY);(2)Windows原…...

OpenGL3.3_C++_Windows(22)
材质: 决定物体在渲染过程中最终视觉呈现的关键因素之一,它通过一系列光学(投光物)和物理参数(反光度,反照率、金属度,折射率……)准确模拟现实世界中的材料特性,从而增…...

electron-builder 打包过慢解决
报错内容如下 > 6-241.0.0 build > electron-builder • electron-builder version24.13.3 os10.0.22631 • loaded configuration filepackage.json ("build" field) • writing effective config filedist\builder-effective-config.yaml • pack…...
leetcode226反转二叉树
本文主要讲解反转二叉树的要点与细节,按照步骤思考更方便理解 c和java代码如下,末尾 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 具体要点: 1. 首先我们要理解题意, 反转二叉树具体…...

【自然语言处理系列】探索NLP:使用Spacy进行分词、分句、词性标注和命名实体识别,并以《傲慢与偏见》与全球恐怖活动两个实例文本进行分析
本文深入探讨了scaPy库在文本分析和数据可视化方面的应用。首先,我们通过简单的文本处理任务,如分词和分句,来展示scaPy的基本功能。接着,我们利用scaPy的命名实体识别和词性标注功能,分析了Jane Austen的经典小说《傲…...
【Rust】function和methed的区别
文章目录 functionmethedAssociated Functions 参考资料 一句话总结: function和methed很多都是相同的。 不同点在于: methed定义在结构体里面,并且它的第一个参数肯定是self,代表结构体实例。方法需要用实例名.方法名调用当然结…...

python基础语法 003-4 数据类型集合
1 集合 1.1 什么是集合 什么是集合?ANS:集合set是一个无序的不重复元素序列集合怎么表示?ANS: {} , 用逗号隔开打印元组类型,type()一个元素的集合怎么表示?:ANS:存储多种类型{"a", 1} """…...
Vue如何引用组件
在 Vue.js 中,你可以通过几种方式引用组件: 全局注册 在 main.js 或你的主入口文件中,你可以使用 Vue.component() 方法来全局注册一个组件。这意味着这个组件可以在你的 Vue 应用的任何地方使用。 import MyComponent from ./components/…...
vue3中省市区联动在同一个el-form-item中咋么设置rules验证都不为空的效果
在开发中出现如下情况,在同一个el-form-item设置了省市区三级联动的效果 <el-form-item label"地区" prop"extraProperties.Province"><el-row :gutter"20"><el-col :span"12"><el-select v-model&qu…...

如何集成CppCheck到visual studio中
1.CPPCheck安装 在Cppcheck官方网站下载最新版本1.70,官网链接:http://cppcheck.sourceforge.net/ 安装Cppcheck 2.集成步骤 打开VS,菜单栏工具->外部工具->添加,按照下图设置,记得勾选“使用输出窗口” 2.…...

GWO-CNN-SVM,基于GWO灰狼优化算法优化卷积神经网络CNN结合支持向量机SVM数据分类(多特征输入多分类)
GWO-CNN-SVM,基于GWO灰狼优化算法优化卷积神经网络CNN结合支持向量机SVM数据分类(多特征输入多分类) 1. GWO灰狼优化算法 灰狼优化算法(Grey Wolf Optimizer, GWO)是一种启发式优化算法,模拟了灰狼群体的社会行为,包…...

Go-知识测试-工作机制
Go-知识测试-工作机制 生成test的maintest的main如何启动case单元测试 runTeststRunnertesting.T.Run 示例测试 runExamplesrunExampleprocessRunResult 性能测试 runBenchmarksrunNtesting.B.Run 在 Go 语言的源码中,go test 命令的实现主要在 src/cmd/go/internal…...

【小程序静态页面】猜拳游戏大转盘积分游戏小程序前端模板源码
猜拳游戏大转盘积分游戏小程序前端模板源码, 一共五个静态页面,首页、任务列表、大转盘和猜拳等五个页面。 主要是通过做任务来获取积分,积分可以兑换商品,也可用来玩游戏;通过玩游戏既可能获取奖品或积分也可能会消…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...

srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...

Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...

人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...