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…...
【小程序静态页面】猜拳游戏大转盘积分游戏小程序前端模板源码
猜拳游戏大转盘积分游戏小程序前端模板源码, 一共五个静态页面,首页、任务列表、大转盘和猜拳等五个页面。 主要是通过做任务来获取积分,积分可以兑换商品,也可用来玩游戏;通过玩游戏既可能获取奖品或积分也可能会消…...
JupyterServer配置
1. 安装jupyter pip install jupyter -i https://pypi.tuna.tsinghua.edu.cn/simple --default-timeout1000 2. 生成配置 jupyter notebook --generate-config 3. 修改配置,设置密码 获取密码的方式:命令行输入python后,用以下方式获…...
信息检索(57):MINIMIZING FLOPS TO LEARN EFFICIENT SPARSE REPRESENTATIONS
MINIMIZING FLOPS TO LEARN EFFICIENT SPARSE REPRESENTATIONS 摘要1 引言2 相关工作3 预期 FLOPS 次数4 我们的方法5 实验6 结论 发布时间(2020) 最小化 Flop 来学习高效的稀疏表示 摘要 1)学习高维稀疏表示 2)FLOP 集成到损失…...
Python 面试【中级】
欢迎莅临我的博客 💝💝💝,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…...
[Open-source tool]Uptime-kuma的簡介和安裝於Ubuntu 22.04系統
[Uptime Kuma]How to Monitor Mqtt Broker and Send Status to Line Notify Uptime-kuma 是一個基於Node.js的開軟軟體,同時也是一套應用於網路監控的開源軟體,其利用瀏覽器呈現直觀的使用者介面,如圖一所示,其讓使用者可監控各種…...
【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 灰度图像恢复(100分) - 三语言AC题解(Python/Java/Cpp)
🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 …...
leetcode494. 目标和
1.思想方法 2.代码 class Solution { public int findTargetSumWays(int[] nums, int target) {int sum 0;for(int num : nums)sum num;if(sum < Math.abs(target) || (targetsum)%2 ! 0)return 0;int x (targetsum) / 2,n nums.length;//基于滚动数组的方法int[] dp…...
数据结构简介
在容器的基础之上,java引入了数据结构的概念。数据结构可以简单地理解成是一个以特定的布局方式来存储数据的容器。但是我个人觉得这种理解方式不太合理,根据我们学的数据结构的内容,我更倾向于数据结构是数据在容器中的布局方式,…...
PyScript:在浏览器中释放Python的强大
PyScript:Python代码,直接在网页上运行。- 精选真开源,释放新价值。 概览 PyScript是一个创新的框架,它打破了传统编程环境的界限,允许开发者直接在浏览器中使用Python语言来创建丰富的网络应用。结合了HTML界面、Pyo…...
巴黎成为欧洲AI中心 大学开始输出AI创始人
来自Dealroom 的数据显示,在欧洲和以色列AI创业公司中,法国的AI创业公司资金最充裕。Mistral、Owkin、Hugging Face等法国企业已经融资23亿美元,比英国、德国AI创业公司都要多。 一名大学生走出校门凭借聪明才智和一个黄金点子成为富豪&#…...
完全离线的本地问答模型LocalGPT如何实现无公网IP远程连接提问
文章目录 前言环境准备1. localGPT部署2. 启动和使用3. 安装cpolar 内网穿透4. 创建公网地址5. 公网地址访问6. 固定公网地址 前言 本文主要介绍如何本地部署LocalGPT并实现远程访问,由于localGPT只能通过本地局域网IP地址端口号的形式访问,实现远程访问…...
个人网站建设流程/品牌策划ppt案例
2019独角兽企业重金招聘Python工程师标准>>> 自动更新APP代码时,开始用的是以下代码 Intent intent new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.parse("file://"Constants.SDK_DIRFile.separatorConstants.SDK_NAME)…...
做商城网站要什么手续/赣州seo外包
导语:算法是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。下面是YJBYS小编收集整理的有关计算机算法的英语词汇,欢迎参考!Median and Selection 中位数Generating Pe…...
佛山做网站哪家好/网站批量查询
L2-算法基础-第07课 递推1, 2, 4, 8, 16 …… 数列的下一项是什么? 1, 2, 3, 5, 8 …… 数列的下一项是什么?递推递推就是指从已知的初始条件出发,依据某种递推关系,逐次推出所要求的各中间结果及最后结果。可用递推算法求解的问题…...
wordpress免费插件下载/郑州网站关键词排名技术代理
BDLocation类,封装了定位SDK的定位结果,在BDLocationListener的onReceive方法中获取。通过该类用户可以获取error code,位置的坐标,精度半径等信息。具体方法请参考类参考。 获取error code: public int getLocType (…...
河北保定建设工程信息网站/最新热点新闻
文章目录前言1.在线翻译2.离线翻译一、多语言离线翻译系统1.开发环境2.准备离线翻译包3.准备python代码4.调试翻译结果5.Python翻译服务对接到.NET Core前言 1.在线翻译 在线翻译,一般是指在线翻译工具,如百度翻译、阿里翻译1688或Google翻译等。这类翻…...
怎么用群晖nas做网站/什么网站推广比较好
实现一个函数,将一个字符串中的所有空格替换为"%20",例如输入字符串"How beautiful you are!",输出结果应为"How%20beautiful%20you%20are!"。首先,如果另开辟一块空间并且足够将全部空格都替换成"%20&qu…...