当前位置: 首页 > news >正文

Socket编程详解(二)核心代码讲解

本文对代码的讲解基于上一篇博客

快速链接 

Socket编程详解(一)服务端与客户端的双向对话


小试牛刀1:委托声明的关键字和委托方法使用的方法名是不一样的名称 

  1. 可读性:有时,委托的名称可能描述了它的用途或它在哪里被使用,而方法的名称可能更具体地描述了它的功能。将两者分开可以使代码更具可读性。
  2. 重用性:同一个方法可以被多个不同的委托使用。如果你有一个通用的方法,它可以被多个不同的操作触发,那么将这些操作定义为不同的委托可能是有意义的。
  3. 封装性:委托可以封装方法的调用,使你可以在不改变原始方法的情况下更改其调用方式(例如,添加额外的日志记录或错误处理)。
  4. 事件:在C#中,事件是基于委托的。将事件名称与触发事件的方法名称分开是一种常见的做法,因为事件通常表示某种更高层次的概念(如“数据已更改”或“操作已完成”),而方法可能只是实现这个概念的具体细节。

总的来说,将委托和方法的名称分开并不是必须的,但它可以提供更好的可读性、重用性和封装性。然而,在大多数情况下,重要的是保持它们之间的签名一致,以确保它们可以正确地相互引用和使用。


 小试牛刀2:对Main方法的理解

这段代码是C#中Windows Forms应用程序的入口点,通常在Program.cs文件中找到。我将为你逐步解释这段代码:

  1. static void Main():
    这是C#应用程序的入口点。当你运行一个C#控制台应用程序或Windows Forms应用程序时,Main方法是首先被调用的。

  2. Application.EnableVisualStyles();:

    • 这行代码使Windows Forms控件能够使用XP和后续版本的Windows中的视觉样式。这意味着控件将具有与操作系统主题一致的外观和感觉。
    • 默认情况下,如果你不调用此方法,Windows Forms控件可能会使用较旧的、不太吸引人的样式。
  3. Application.SetCompatibleTextRenderingDefault(false);:

    • 这行代码告诉Windows Forms应用程序使用GDI+进行文本渲染,而不是GDI。GDI+是GDI(图形设备接口)的一个增强版本,它提供了更丰富的图形和文本渲染功能。
    • 设置此属性的值为false通常与EnableVisualStyles一起使用,以确保文本和图形都以最佳方式呈现。
    • 在某些情况下,如果你的应用程序需要兼容旧的Windows版本或特定的文本渲染行为,你可能需要将此值设置为true。但在现代Windows Forms应用程序中,通常将其设置为false
  4. Application.Run(new FrmTCPServer());:

    • 这行代码启动Windows Forms应用程序的消息循环,并显示FrmTCPServer窗体。
    • Application.Run是Windows Forms应用程序的核心。它启动一个消息循环,该循环监听来自操作系统的消息(如鼠标单击或键盘按键),并将这些消息传递给相应的窗体或控件进行处理。
    • 在这里,你创建了一个新的FrmTCPServer窗体实例,并将其传递给Application.Run方法。这意味着当你运行此应用程序时,FrmTCPServer窗体将首先被显示。

简而言之,这段代码设置了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(只有换行符)。

这里是一个简单的解释:

  1. RecMsg 方法被调用时,传入一个字符串 str
  2. 方法内部,使用 this.txt_Rcv.AppendText 将 str 添加到 txt_Rcv 控件的当前文本末尾。
  3. 接着,在 str 的后面添加一个换行符,这是通过 Environment.NewLine 实现的。
  4. 这样,每次调用 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验证都不为空的效果

在开发中出现如下情况&#xff0c;在同一个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&#xff0c;官网链接&#xff1a;http://cppcheck.sourceforge.net/ 安装Cppcheck 2.集成步骤 打开VS&#xff0c;菜单栏工具->外部工具->添加&#xff0c;按照下图设置&#xff0c;记得勾选“使用输出窗口” 2.…...

GWO-CNN-SVM,基于GWO灰狼优化算法优化卷积神经网络CNN结合支持向量机SVM数据分类(多特征输入多分类)

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

Go-知识测试-工作机制

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

【小程序静态页面】猜拳游戏大转盘积分游戏小程序前端模板源码

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

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...