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

XiaoFeng.Net 网络库使用

网络库介绍

XiaoFeng.Net网络库包含了 SocketServer,SocketClient,WebSocketServer,WebSocketClient四个类库
SocketServer 网络服务端同时支持Socket客户端连接,WebSocket客户端,浏览器WebSocket连接
SocketCleint 网络客户端
WebSocketServer WebSocket服务端仅支持WebSocket客户端连接或浏览器WebSocket连接
WebSocketClient WebSocket客户端

SocketServer 服务端

WebSocketServer 除了实例化参数不一样其它属性和SocketServer是一样的,因为WebSocketServer就是继承了SocketServer

 var c = new SocketServer(8011);//SSL证书
c.Certificate = new X509Certificate2(@"E:\\d.pfx", "7092734", X509KeyStorageFlags.MachineKeySet);
c.SslProtocols= System.Security.Authentication.SslProtocols.Tls12;
//是否启动定时向客户端发送pong功能
c.IsPong = false;
c.PongTime = 30;
c.OnStart += (o, e) =>
{//项目启动后触发当前事件w("项目启动.");
};
c.OnAuthentication += (c, m, e) =>
{//认证事件//对应Authentication认证委托,认证失败后会触发当前事件
};
c.Authentication = c =>
{//认证方法//在这里判断客户端是否是我们合法的客户端请求连接 return false 表示拒绝连接请求 return true 表示接受连接请求return true;
};
c.OnStop += (c, e) =>
{//项目停止后触发的事件w("项目停止.");
};
//下边OnMessage,OnMessageByte两个事件在实际工作中根据自己的需求用其中一个事件即可
c.OnMessage += (c, m, e) =>
{//接收到消息后触发当前事件w($"接收到消息[{c.EndPoint}](text):{m}");//向当前客户端发送接收到的消息c.Send(m);
};
c.OnMessageByte += (c, m, e) =>
{//接收到消息后触发当前事件w($"接收到消息[{c.EndPoint}](bytes):{m.GetString()}");//向当前客户端发送接收到的消息c.Send(m);
};
c.OnError += (c, e) =>
{//服务端出错触发当前事件w("出错:" + e.Message);
};
c.OnNewConnection += (c, e) =>
{//有新的客户端连接请求触发当前事件w($"新连接[{c.EndPoint}]");
};
c.OnDisconnected += (c, e) =>
{//客户端断开连接后触发当前事件w($"断开连接[{c.EndPoint}]");
};
c.OnClientError += (c,ip, e) =>
{//处理客户端出错时触发当前事件w($"客户端出错[{c.EndPoint}]:{e.Message}");
};
//启动
c.Start();//其它方法及属性
//当前连接的客户端
var clients = c.Clients;//添加黑名单 添加进黑名单的IP 通过这个IP的客户端都拒绝连接服务端
c.AddBlack("192.138.1.2");
//移除黑名单
c.RemoveBlack("192.168.1.2");Console.WriteLine();

SocketClient 客户端

WebSocketClient也是继承于SocketClient 所以它的属性和SocketClient也是一样的。
下边直接上代码

var ws = new SocketClient("127.0.0.1", 8011);
//是否启动定时ping功能
ws.IsPing = false;
ws.PingTime = 30;ws.OnMessage += (c, m, e) =>
{w("接收到消息(text):" + m);
};
ws.OnMessageByte += (c, m, e) =>
{w("接收到消息(bytes):" + m.GetString());
};
ws.OnClientError += (c,ip, e) =>
{w("出错:" + e.Message);
};
ws.OnStart += async (c, e) =>
{w("已启动");//await ws.SendAsync("消息").ConfigureAwait(false);
};
ws.OnStop += (c, e) =>
{w("已停止");
};
ws.Start();
Console.ReadLine();

WebSocketClient还有一个单独的属性WebSocketRequestOptions 它是一个请示配置类看它的完整代码

/// <summary>
/// WebSocketClient请求配置
/// </summary>
public class WebSocketRequestOptions
{#region 构造器/// <summary>/// 无参构造器/// </summary>public WebSocketRequestOptions(){this.WebHeader = new WebHeaderCollection();this[HttpRequestHeader.Connection] = "Upgrade";this[HttpRequestHeader.Pragma] = "no-cache";this["Sec-WebSocket-Extensions"] = "permessage-deflate; client_max_window_bits";this["Sec-WebSocket-Version"] = "13";this[HttpRequestHeader.Upgrade] = "websocket";this[HttpRequestHeader.UserAgent] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36";this[HttpRequestHeader.AcceptEncoding] = (AcceptEncodingType.GZIP | AcceptEncodingType.DEFLATE | AcceptEncodingType.BR).ToLower();this[HttpRequestHeader.CacheControl] = "no-cache";this[HttpRequestHeader.AcceptLanguage] = "zh-CN,zh;q=0.9";}#endregion#region 属性/// <summary>/// 获取请求头值/// </summary>/// <param name="header">头key <see cref="HttpRequestHeader"/></param>/// <returns>请求头值</returns>public String this[HttpRequestHeader header]{get => this.Get(header);set => this.Set(header, value);}/// <summary>/// 获取请求头值/// </summary>/// <param name="header">头key <see cref="HttpResponseHeader"/></param>/// <returns>请求头值</returns>public String this[HttpResponseHeader header]{get => this.Get(header);set => this.Set(header, value);}/// <summary>/// 获取请求头值/// </summary>/// <param name="key">key</param>/// <returns>请求头值</returns>public String this[String key]{get => this.Get(key);set => this.Set(key, value);}/// <summary>/// 请求地址/// </summary>private Uri _Uri;/// <summary>/// 请求地址 <see cref="System.Uri"/>/// </summary>public Uri Uri{get => this._Uri; set{this._Uri = value;this[HttpRequestHeader.Host] = value.Host + ":" + value.Port;}}/// <summary>/// 请求类型 <see cref="XiaoFeng.Http.HttpMethod"/> 或 <see cref="System.Net.Http.HttpMethod"/>/// </summary>public HttpMethod Method { get; set; } = HttpMethod.Get;/// <summary>/// Http协议版本 1.0,1.1,2.0,3.0/// </summary>public HttpVersionX HttpVersion { get; set; } = HttpVersionX.Version11;/// <summary>/// Host 标头,指定要请求的资源的主机名和端口号。/// </summary>public String Host => this[HttpRequestHeader.Host];/// <summary>/// Connection 标头,指定特定连接所需的选项。指定客户端和服务器之间的连接类型,如 keep-alive、close 等。/// </summary>public String Connection => this[HttpRequestHeader.Connection];/// <summary>/// Pragma 标头,指定特定于实现的指令,这些指令可应用到请求/响应链上的任意代理。用来包含实现特定的指令。/// </summary>public String Pragma => this[HttpRequestHeader.Pragma];/// <summary>/// 源头/// </summary>public String Origin{get => this["Origin"];set => this["Origin"] = value;}/// <summary>/// 客户端支持的扩展列表/// </summary>public String SecWebSocketExtensions{get => this["Sec-WebSocket-Extensions"];set => this["Sec-WebSocket-Extensions"] = value;}/// <summary>/// 请求标识key/// </summary>public String SecWebSocketKey{get => this["Sec-WebSocket-Key"];set => this["Sec-WebSocket-Key"] = value;}/// <summary>/// WebSocket版本/// </summary>public String SecWebSocketVersion => this["Sec-WebSocket-Version"];/// <summary>/// Upgrade 标头,指定客户端支持的其他通信协议。向服务器指定某种传输协议以便服务器进行转换。/// </summary>public String Upgrade => this[HttpRequestHeader.Upgrade];/// <summary>/// User-Agent 标头,指定有关客户端代理的信息。标识浏览器的详细信息,包括名称、版本、操作系统等。/// </summary>public String UserAgent{get => this[HttpRequestHeader.UserAgent];set => this[HttpRequestHeader.UserAgent] = value;}/// <summary>/// Accept-Charset 标头,指定响应可接受的内容编码。指定客户端可以接受的压缩编码类型/// </summary>public AcceptEncodingType AcceptEncoding{get => this[HttpRequestHeader.AcceptEncoding].ToUpper().ToCast<AcceptEncodingType>();set => this[HttpRequestHeader.AcceptEncoding] = value.ToLower();}/// <summary>/// Cache-Control 标头,指定请求/响应链上所有缓存控制机制必须服从的指令。如 no-cache、max-age 等。/// </summary>public String CacheControl => this[HttpRequestHeader.CacheControl];/// <summary>/// Accept-Langauge 标头,指定用于响应的首选自然语言。。/// </summary>public String AcceptLanguage{get => this[HttpRequestHeader.AcceptLanguage];set => this[HttpRequestHeader.AcceptLanguage] = value;}/// <summary>/// Referer 标头,指定可从中获取请求 URI 的资源 URI。/// </summary>public String Referer{get => this[HttpRequestHeader.Referer];set => this[HttpRequestHeader.Referer] = value;}/// <summary>/// From 标头,指定控制请求的用户代理的用户的 Internet 电子邮件地址。/// </summary>public String From{get => this[HttpRequestHeader.From];set => this[HttpRequestHeader.From] = value;}/// <summary>/// Authorization 标头,指定客户端提供的以向服务器验证自身身份的凭据。 凭证是 (用户名:密码)的base64/// </summary>/// <remarks>/// <para>假设用户名为jacky密码为eelf.cn则代码就是/// <code>Convert.ToBase64String(Encoding.UTF8.GetBytes("jacky:eelf.cn"))</code>/// </para>/// <code>/// 则上面的帐号密码输出为以下/// /// Authorization: Basic amFja3k6ZWVsZi5jbg==/// </code>/// </remarks>public String Authorization{get => this[HttpRequestHeader.Authorization];set => this[HttpRequestHeader.Authorization] = value;}/// <summary>/// Proxy-Authorization 标头,指定客户端提供的以向代理验证自身身份的凭据。/// </summary>/// <remarks>/// 设置参照 <see cref="Authorization"/> 属性设置/// </remarks>public String ProxyAuthorization{get => this[HttpRequestHeader.ProxyAuthorization];set => this[HttpRequestHeader.ProxyAuthorization] = value;}/// <summary>///  Cookie 标头,指定向服务器提供的 cookie 数据。/// </summary>public String Cookie{get => this[HttpRequestHeader.Cookie];set => this[HttpRequestHeader.Cookie] = value;}/// <summary>///  Content-Encoding 标头,指定应用到随附的正文数据的编码。/// </summary>public String ContentEncoding{get => this[HttpRequestHeader.ContentEncoding];set => this[HttpRequestHeader.ContentEncoding] = value;}/// <summary>///  Content-Language 标头,指定随附的正文数据的自然语言。/// </summary>public String ContentLangauge{get => this[HttpRequestHeader.ContentLanguage];set => this[HttpRequestHeader.ContentLanguage] = value;}/// <summary>///  Content-MD5 标头,指定随附的正文数据的 MD5 摘要,以便提供端到端消息完整性检查。 由于 MD5 出现冲突问题,Microsoft 建议使用基于SHA256 或更高版本的安全模型。/// </summary>public String ContentMd5{get => this[HttpRequestHeader.ContentMd5];set => this[HttpRequestHeader.ContentMd5] = value;}/// <summary>/// 自定义协议标头。/// </summary>private WebHeaderCollection WebHeader { get; set; }#endregion#region 方法/// <summary>/// 设置协议标头信息/// </summary>/// <param name="key">协议标头key</param>/// <param name="value">协议标头value</param>public void Set(string key, string value){if (key.IsNullOrEmpty()) return;if (this.WebHeader == null) this.WebHeader = new WebHeaderCollection();this.WebHeader.Set(key, value);}/// <summary>/// 设置协议标头信息/// </summary>/// <param name="header">协议标头key <see cref="HttpRequestHeader"/></param>/// <param name="value">协议标头value</param>public void Set(HttpRequestHeader header, string value){if (this.WebHeader == null) this.WebHeader = new WebHeaderCollection();this.WebHeader.Set(header, value);}/// <summary>/// 设置协议标头信息/// </summary>/// <param name="header">协议标头 key <see cref="HttpResponseHeader"/></param>/// <param name="value">协议标头 value</param>public void Set(HttpResponseHeader header, string value){if (this.WebHeader == null) this.WebHeader = new WebHeaderCollection();this.WebHeader.Set(header, value);}/// <summary>/// 添加协议标头信息/// </summary>/// <param name="key">协议标头 key</param>/// <param name="value">协议标头 value</param>public void Add(string key, string value){if (key.IsNullOrEmpty()) return;if (this.WebHeader == null) this.WebHeader = new WebHeaderCollection();this.WebHeader.Add(key, value);}/// <summary>/// 添加协议标头信息/// </summary>/// <param name="header">协议标头 key <see cref="HttpRequestHeader"/></param>/// <param name="value">协议标头 value</param>public void Add(HttpRequestHeader header, string value){if (this.WebHeader == null) this.WebHeader = new WebHeaderCollection();this.WebHeader.Add(header, value);}/// <summary>/// 添加协议标头信息/// </summary>/// <param name="header">协议标头 key <see cref="HttpResponseHeader"/></param>/// <param name="value">协议标头 value</param>public void Add(HttpResponseHeader header, string value){if (this.WebHeader == null) this.WebHeader = new WebHeaderCollection();this.WebHeader.Add(header, value);}/// <summary>/// 获取协议标头数据/// </summary>/// <param name="header">协议标头 key <see cref="HttpRequestHeader"/></param>/// <returns>协议标头值</returns>public string Get(HttpRequestHeader header){if (this.WebHeader == null) return String.Empty;return this.WebHeader[header];}/// <summary>/// 获取协议标头数据/// </summary>/// <param name="key">协议标头 key</param>/// <returns>协议标头值</returns>public string Get(string key){if (this.WebHeader == null) return String.Empty;return this.WebHeader[key];}/// <summary>/// 获取响应协议标头数据/// </summary>/// <param name="header">响应协议标头key <see cref="HttpResponseHeader"/></param>/// <returns>响应协议标头数据</returns>public string Get(HttpResponseHeader header){if (this.WebHeader == null) return String.Empty;return this.WebHeader[header];}/// <summary>/// 转成协议标头字符串/// </summary>/// <returns>合并协议标头字符串</returns>public override string ToString(){var sbr = new StringBuilder();sbr.AppendLine($"{this.Method} {this.Uri?.PathAndQuery} HTTP/{((float)this.HttpVersion) / 10F}");sbr.Append(this.WebHeader.ToString());return sbr.ToString();}#endregion
}

从上边的代码可以看出来,所有http请求的头基本上都有,如果自定义的头信息怎么办,那么就用当前配置的Add方法来添加。

开源地址:XiaoFeng

如果喜欢可以给作者点个星哦!!!

相关文章:

XiaoFeng.Net 网络库使用

网络库介绍 XiaoFeng.Net网络库包含了 SocketServer,SocketClient,WebSocketServer,WebSocketClient四个类库 SocketServer 网络服务端同时支持Socket客户端连接&#xff0c;WebSocket客户端&#xff0c;浏览器WebSocket连接 SocketCleint 网络客户端 WebSocketServer WebSock…...

【ES6】—数组的扩展

一、类数组/ 伪数组 1. 类/伪数组: 并不是真正意义的数组&#xff0c;有长度的属性&#xff0c;但无法使用Array原型上的方法 let divs document.getElementsByTagName(div) console.log(divs) // HTMLCollection []let divs2 document.getElementsByClassName("xxx&q…...

Android 实现资源国际化

前言 国际化指的是当Android系统切换语言时&#xff0c;相关设置也随之改变&#xff0c;从而使用不同的国家地区&#xff1b; 简而言之&#xff0c;就是我们的Android App中的文字和图片会随着不同国家的地区变化从而切换为不同语言文字和不同国家的图片 文字图片国际化 只要…...

uni、js——点击与禁用(不可点击)、动态样式class

案例 没约满的时间可以点击进行选择&#xff0c;约满的就不能选择了。选择完之后变色变字。 核心思想就是创建一个第三方变量存起来&#xff0c;点击谁就存到第三方&#xff0c;在根据这个进行判断。 代码 <template><view class"content"><view cl…...

分布式技术

分布式没有权威的技术&#xff0c;只有实践经验和积累的组件。常见的分布式技术有发号机制、分布式数据库、分布式数据库事物、基于Redis的分布式缓存、分布式会话、分布式安全认证。 1、发号机制 在数据库&#xff08;关系数据库&#xff09;中&#xff0c;主键往往是一条记…...

Consul的简介与安装

1、Consul简介 Consul是一套开源的分布式服务发现和配置管理系统&#xff0c;由HashiCorp公司用Go语言开发&#xff0c;Consul提供了微服务系统中的服务治理、配置中心、控制总线等功能。这些功能中的每一个都可以根据需要单独使用&#xff0c;也可以一起使用以构建全方位的服…...

微服务框架 go-zero logx 日志组件剖析

addTenant api 和 rpc 的实现 上一篇我们说到咱们还剩下 addTenant 功能还未实现&#xff0c;不知道有没有兄弟感兴趣去实验一波的&#xff0c;本篇文章进行简要补充 根据上一篇文章分析&#xff0c;其实我们只需要执行如下几步即可&#xff1a; 编写 tenant.api&#xff0c…...

基于Java+SpringBoot+Vue前后端分离图书电子商务网站设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…...

C# Winfrom通过COM接口访问和控制Excel应用程序,将Excel数据导入DataGridView

1.首先要创建xlsx文件 2.在Com中添加引用 3. 添加命名空间 using ApExcel Microsoft.Office.Interop.Excel; --这样起个名字方面后面写 4.样例 //点击操作excelDataTable dt new DataTable();string fileName "D:\desktop\tmp\test.xlsx";ApExcel.Application exA…...

Linux-tomcat环境搭建、jpress部署实践、nginx反向代理

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xf…...

SQLmap使用

文章目录 利用sqlmap 注入得到cms网站后台管理员账密获取数据库名称获取cms数据库的表名获取users表中的字段&#xff08;内容&#xff09;获取username字段和password字段的内容 salmap破解psot请求数据包salmap获取getshell 利用sqlmap 注入得到cms网站后台管理员账密 获取数…...

【Flutter】Flutter 使用 infinite_scroll_pagination 实现无限滚动分页

【Flutter】Flutter 使用 infinite_scroll_pagination 实现无限滚动分页 文章目录 一、前言二、安装和基本使用1. 添加依赖2. 基础配置和初始化 三、实际业务中的用法1. 与 API 集成2. 错误处理 四、完整示例1. 创建一个无限滚动列表2. 使用在你的应用中3. 完整代码示例 五、总…...

python爬虫的js逆向入门到进阶教程文章分享汇总~持续更新

目录 一、内容介绍二 、专栏内容-持续更新1、JS逆向入门2、Js逆向进阶3、爬虫基础知识4、工具与安装5、漫星内容分享 三、星球使用四、b站up主视频推荐 一、内容介绍 二 、专栏内容-持续更新 1、JS逆向入门 2023-08-25》11.常见加密>xx音乐RSA加密 https://articles.zsxq.c…...

面试常问:水平居中和垂直居中的方法

水平居中 文本居中 如果元素为行内元素&#xff0c;可以将父元素的text-align属性设置为center&#xff0c;这样子元素就会水平居中对齐 .text{text-align: center; }固定宽度的居中 如果元素宽度已知并固定&#xff0c;可以通过将左右margin设置为auto来实现水平居中。 .…...

第七届“蓝帽杯”初赛取证题目分享

前言&#xff1a; 刚刚打完比赛&#xff0c;准备晚上写一下wp&#xff0c;刚好整理一下题目&#xff0c;ctf的题目一般都有&#xff0c;取证不一定&#xff0c;所以我整理一下&#xff0c;方便大家复盘。 题目&#xff1a; 1&#xff1a;【APK取证】涉案apk的包名是&#xff…...

go语言学习之有关变量的知识

文章目录 变量的学习1.变量的使用步骤2.变量的注意事项3.变量使用的三种方式&#xff1a;4.程序中 号的使用5.变量的数据类型1&#xff09;int数据类型2&#xff09;小数类型浮点型3&#xff09;**字符类型**4&#xff09;**字符串&#xff08;String&#xff09;类型**5&…...

算法通过村第8关【青铜】| 二叉树的经典算法题

二叉树的双指针 1.相同的树 思路&#xff1a;递归的挨个比较是否相同 class Solution {public boolean isSameTree(TreeNode p, TreeNode q) {if((p null&&q!null) || (p ! null && q null) || (p!null&&q!null&&p.val ! q.val)){return f…...

Open3D 点云均值滤波

目录 一、算法原理1、均值滤波2、参考文献二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 1、均值滤波 对待处理的当前采样点,选择一个模板,该模板由其邻近的若干个数据点组成,…...

C语言指针入门详解

一、指针简介 指针(Pointer)是C语言的一个重要知识点&#xff0c;其使用灵活、功能强大&#xff0c;是C语言的灵魂指针与底层硬件联系紧密&#xff0c;使用指针可操作数据的地址&#xff0c;实现数据的间接访问指针就是地址&#xff0c;通过访问此地址来获取该地址存储的数据 …...

软件工程(十四) 设计模式之结构型模式(二)

1、组合模式 简要说明 将对象组合成树形结构以表示“整体-部分”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。 速记关键字 树形目录结构 类图如下 由类图其实可以看出,组合模式就是将具有父子关系的结构,组装形成一棵树,并且根据规范,树干节点和叶子节…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...