TCP服务器主动断开客户端
自定义消息函数
afx_msg LRESULT CbaseMFCprojectDlg::OnOnsocketbartender(WPARAM wParam, LPARAM lParam)
WPARAM wParam:消息来源
res = recv(wParam, cs, 65535, 0);获取这个客户端端口socket通道里面的信息长度为65535存放在cs里面
如果获取得到res==0即是说明该客户端已经断开了与服务器的连接,服务器需要主动关闭此连接
closesocket(wParam);关闭这一消息通道的函数
afx_msg LRESULT CbaseMFCprojectDlg::OnOnsocketbartender(WPARAM wParam, LPARAM lParam)
{CString str("");char cs[65535] = "";char cs2[65535] = "";char cs3[65535] = "";char cs4[65535] = "";char cs5[65535] = "";char cs6[65535] = "";char cs7[65535] = "";char cs8[65535] = "";char cs9[65535] = "";char cs10[65535] = "";//char cs11[65535] = "";//char cs12[65535] = "";//char cs13[65535] = "";//char cs14[65535] = "";//char cs15[65535] = "";//char cs16[65535] = "";//char cs17[65535] = "";//char cs18[65535] = "";//char cs19[65535] = "";//char cs20[65535] = "";switch (lParam){case FD_ACCEPT://连接请求{int length = sizeof(m_addrServerBack_Bartender);//接收客户端的请求m_ServerSocketBack_Bartender = accept(m_ServerSocket_Bartender, (sockaddr*)&m_addrServerBack_Bartender, &length);m_wParamsBartender.emplace_back(m_ServerSocketBack_Bartender);SetTimer(2, 2000, NULL);}break;case FD_READ://发送数据请求{//CString num = "";CString num("");CString num2("");CString num3("");CString num4("");CString num5("");//CString num6("");//CString num7("");//CString num8("");//CString num9("");CString num10("");//CString num11("");//CString num12("");//CString num13("");//CString num14("");//CString num15("");//CString num16("");//CString num17("");//CString num18("");//CString num19("");//CString num20("");//CString temp;//temp = m_recvupcomputer;int res;res = recv(wParam, cs, 65535, 0);//最大读取int类型65535长度的内容res = recv(wParam, cs2, 65535, 0);//res返回为0表示客户端已经断开连接,为大于1的数则表示成功读取,为-1则表示有连接但读取失败res = recv(wParam, cs3, 65535, 0);res = recv(wParam, cs4, 65535, 0);res = recv(wParam, cs5, 65535, 0);//res = recv(wParam, cs6, 65535, 0);//res = recv(wParam, cs7, 65535, 0);//res = recv(wParam, cs8, 65535, 0);//res = recv(wParam, cs9, 65535, 0);res = recv(wParam, cs10, 65535, 0);//res = recv(wParam, cs11, 65535, 0);//res = recv(wParam, cs12, 65535, 0);//res = recv(wParam, cs13, 65535, 0);//res = recv(wParam, cs14, 65535, 0);//res = recv(wParam, cs15, 65535, 0);//res = recv(wParam, cs16, 65535, 0);//res = recv(wParam, cs17, 65535, 0);//res = recv(wParam, cs18, 65535, 0);//res = recv(wParam, cs19, 65535, 0);//res = recv(wParam, cs20, 65535, 0);num = cs;num2 = cs2;num3 = cs3;num4 = cs4;num5 = cs5;//num6 = cs6;//num7 = cs7;//num8 = cs8;//num9 = cs9;num10 = cs10;//num11 = cs11;//num12 = cs12;//num13 = cs13;//num14 = cs14;//num15 = cs15;//num16 = cs16;//num17 = cs17;//num18 = cs18;//num19 = cs19;//num20 = cs20;if (res == 0 && num.GetLength() == 0) {closesocket(wParam);//客户端已经断开连接,服务器这边需要释放掉这个客户端writeShowLog2(_T("bartender正常断开"));writeErrorLog("bartender正常断开");//if (m_recvzpls.size() == m_parameters_fileds[0].at("connom_tagnum").ivalue * 2) {// ::PostMessage(theMainDlg->m_hWnd, WM_SOCKET_CLIENT_PLC, 0, 2);//激活自发打印事件//}if (m_printResultSend > 0) {KillTimer(4);m_printResultSend = 0;JsonmesSend jms;jms.code = "0";jms.mcuIndex = "1";jms.businessType = "printResult";std::string bostr = "";jms.bo = bostr;MesServerSend(jms);}for (int i = 0; i < m_wParamsBartender.size(); i++) {if (wParam == m_wParamsBartender[i]) {m_wParamsBartender.erase(m_wParamsBartender.begin() + i);//在vector中erase掉这个客户端break;}}break;if (m_wParamsBartender.size() <= 0) {KillTimer(2);}}CString stateStr;//CString recv;stateStr.Format(_T("收到Bartender%s"), num);//recv += num;//m_recvupcomputer = temp;m_recvBartender += num;if (num2.GetLength() > 0) {m_recvBartender += num2;stateStr += num2;}if (num3.GetLength() > 0) {m_recvBartender += num3;stateStr += num3;}if (num4.GetLength() > 0) {m_recvBartender += num4;stateStr += num4;}if (num5.GetLength() > 0) {m_recvBartender += num5;stateStr += num5;}//if (num6.GetLength() > 0) {// m_recvBartender += num6;// stateStr += num6;//}//if (num7.GetLength() > 0) {// m_recvBartender += num7;// stateStr += num7;//}//if (num8.GetLength() > 0) {// m_recvBartender += num8;// stateStr += num8;//}//if (num9.GetLength() > 0) {// m_recvBartender += num9;// stateStr += num9;//}if (num10.GetLength() > 0) {m_recvBartender += num10;stateStr += num10;if (num10.GetLength() > 60000) {writeShowLog(_T("传输过长请处理,bartender"));writeErrorLog("传输过长请处理,bartender");}}//if (num20.GetLength() > 0) {// m_recvBartender += num20;// stateStr += num20;// if (num20.GetLength() > 60000) {// writeShowLog(_T("传输过长请处理,bartender"));// writeErrorLog("传输过长请处理,bartender");// }//}//{"number":-1}//if (m_upcomputerstatus == 0) {if (num.GetLength() > 0) {//说明有接收长度std::string log = (CW2A)stateStr;writeErrorLog(log);CString findstart2, findend2;findstart2 = _T("^XA");findend2 = _T("^XZ");//重新寻找重定位s2,e2int s2 = m_recvBartender.Find(findstart2);int e2 = m_recvBartender.Find(findend2);if (s2 >= 0) {//closesocket(m_ServerSocketBack_Bartender);//m_wParam = wParam;//SetTimer(2, 2000, NULL);m_upcomputerstatus = 2;if (e2 > 0) {m_upcomputerstatus = 0;CString recvzpl;recvzpl = m_recvBartender.Mid(s2, e2 - s2 + findend2.GetLength());m_recvzpls.emplace_back(recvzpl);m_recvBartender = m_recvBartender.Right(m_recvBartender.GetLength() - e2 - findend2.GetLength());//重新寻找重定位s2,e2s2 = m_recvBartender.Find(findstart2);e2 = m_recvBartender.Find(findend2);while (s2 >= 0) {if (e2 < 0) {break;}recvzpl = m_recvBartender.Mid(s2, e2 - s2 + findend2.GetLength());m_recvzpls.emplace_back(recvzpl);m_recvBartender = m_recvBartender.Right(m_recvBartender.GetLength() - e2 - findend2.GetLength());//重新寻找重定位s2,e2s2 = m_recvBartender.Find(findstart2);e2 = m_recvBartender.Find(findend2);};if (s2 < 0) {m_recvBartender = m_recvBartender.Right(m_recvBartender.GetLength() < findstart2.GetLength() ? m_recvBartender.GetLength() : findstart2.GetLength());}//if (m_recvzpls.size() == m_parameters_fileds[0].at("connom_tagnum").ivalue * 2) {if (m_recvzpls.size() > 0) {if (m_printerSendTimes == 0) {::PostMessage(theMainDlg->m_hWnd, WM_SOCKET_CLIENT_PLC, 0, 2);//激活自发打印事件}}if (m_recvzpls.size() == m_parameters_fileds[0].at("connom_tagnum").ivalue * 2) {//if (m_recvzpls.size() >0) {{closesocket(wParam);//完整接受zpl自动断开连接,服务器这边需要释放掉这个客户端writeShowLog2(_T("bartender正常自动断开"));writeErrorLog("bartender正常自动断开");if (m_printResultSend > 0) {KillTimer(4);m_printResultSend = 0;JsonmesSend jms;jms.code = "0";jms.mcuIndex = "1";jms.businessType = "printResult";std::string bostr = "";jms.bo = bostr;MesServerSend(jms);}for (int i = 0; i < m_wParamsBartender.size(); i++) {if (wParam == m_wParamsBartender[i]) {m_wParamsBartender.erase(m_wParamsBartender.begin() + i);//在vector中erase掉这个客户端break;}}break;if (m_wParamsBartender.size() <= 0) {KillTimer(2);}}}else if (m_recvzpls.size() > m_parameters_fileds[0].at("connom_tagnum").ivalue * 2) {writeShowLog2(_T("bartenderZPL超限"));writeErrorLog("bartenderZPL超限");}}}else {if (e2 >= 0) {writeShowLog2(_T("zpl错误"));m_recvBartender = _T("");}}CString show;show.Format(_T("zpl个数:%d"), m_recvzpls.size());writeShowLog2(show);log = (CW2A)show;writeErrorLog(log);}}break;}return 0;
}
相关文章:
TCP服务器主动断开客户端
自定义消息函数 afx_msg LRESULT CbaseMFCprojectDlg::OnOnsocketbartender(WPARAM wParam, LPARAM lParam) WPARAM wParam:消息来源 res recv(wParam, cs, 65535, 0);获取这个客户端端口socket通道里面的信息长度为65535存放在cs里面 如果获取得到res0即是说明该客户端已经断…...
接口自动化中json.dumps()跟json.loads()区别详解
接口自动化中对于参数处理经常会用到json.dumps()跟json.loads(),下面主要分享一下自己使用总结 1.主要区别 json.dumps() 用于将字典转换为字符串格式 json.loads()用于将字符串转换为字典格式 import jsondict1 {"name":"amy","gender":woma…...
计算机网络-配置双机三层互联(静态路由方式)
目录 交换机工作原理路由器工作原理路由信息表组成部分路由器发决策 ARP工作原理配置双机三层互联(静态路由方式) 交换机工作原理 MAC自学习过程 初始状态: 刚启动的交换机的MAC地址表是空的。 学习过程: 当交换机收到一个数据帧…...
ES(Elasticsearch)常用的函数有哪些?
【电子书大全】内含上千本顶级编程书籍,是程序员必备的电子书资源包,并且会不断地更新,助你在编程的道路上更上一层楼! 链接: https://pan.baidu.com/s/1yhPJ9LmS_z5TdgIgxs9NvQ?pwdyyds > 提取码: yyds Elasticsearch&#x…...
【计算机网络】ICMP报文实验
一:实验目的 1:掌握ICMP报文的各种类型及其代码。 2:掌握ICMP报文的格式。 3:深入理解TTL的含义(Time to Live,生存时间)。 二:实验仪器设备及软件 硬件:RCMS-C服务器…...
transformers进行学习率调整lr_scheduler(warmup)
一、get_scheduler实现warmup 1、warmup基本思想 Warmup(预热)是深度学习训练中的一种技巧,旨在逐步增加学习率以稳定训练过程,特别是在训练的早期阶段。它主要用于防止在训练初期因学习率过大导致的模型参数剧烈波动或不稳定。…...
智能优化算法之灰狼优化算法(GWO)
智能优化算法是一类基于自然界中生物、物理或社会现象的优化技术。这些算法通过模拟自然界中的一些智能行为,如遗传学、蚁群觅食、粒子群体运动等,来解决复杂的优化问题。智能优化算法广泛应用于各种工程和科学领域,因其具有全局搜索能力、鲁…...
昇思25天学习打卡营第17天|计算机视觉
昇思25天学习打卡营第17天 文章目录 昇思25天学习打卡营第17天ShuffleNet图像分类ShuffleNet网络介绍模型架构Pointwise Group ConvolutionChannel ShuffleShuffleNet模块构建ShuffleNet网络 模型训练和评估训练集准备与加载模型训练模型评估模型预测 打卡记录 ShuffleNet图像分…...
Windows图形界面(GUI)-MFC-C/C++ - 键鼠操作
公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 目录 MFC鼠标 派发流程 鼠标消息(客户区) 鼠标消息(非客户) 坐标处理 客户区 非客户 坐标转换 示例代码 MFC键盘 击键消息 虚拟键代码 键状态 MFC鼠标 派发流程 消息捕获&#…...
Angular 18.2.0 的新功能增强和创新
一.Angular 增强功能 Angular 是一个以支持开发强大的 Web 应用程序而闻名的平台,最近发布了 18.2.0 版本。此更新带来了许多新功能和改进,进一步增强了其功能和开发人员体验。在本文中,我们将深入探讨 Angular 18.2.0 为开发人员社区提供的…...
matlab 小数取余 rem 和 mod有 bug
目录 前言Matlab取余函数1 mod 函数1.1 命令行输入1.2 命令行输出 2 rem 函数2.1 命令行输入2.2 命令行输出 分析原因注意 前言 在 Matlab 代码中mod(0.11, 0.1) < 0.01 判断为真,mod(1.11, 0.1) < 0.01判断为假,导致出现意料外的结果。 结果发现…...
Avalonia中的数据模板
文章目录 1. 介绍和概述什么是数据模板:数据模板的用途:2. 定义数据模板在XAML中定义数据模板:在代码中定义数据模板:3. 使用数据模板在控件中使用数据模板:数据模板选择器:定义数据模板选择器:在XAML中使用数据模板选择器:4. 复杂数据模板使用嵌套数据模板:使用模板绑…...
Sqlmap中文使用手册 - Techniques模块参数使用
目录 1. Techniques模块的帮助文档2. 各个参数的介绍2.1 --techniqueTECH2.2 --time-secTIMESEC2.3 --union-colsUCOLS2.4 --union-charUCHAR2.5 --union-fromUFROM2.6 --dns-domainDNS2.7 --second-urlSEC2.8 --second-reqSEC 1. Techniques模块的帮助文档 Techniques:These o…...
科普文:kubernets原理
kubernetes 已经成为容器编排领域的王者,它是基于容器的集群编排引擎,具备扩展集群、滚动升级回滚、弹性伸缩、自动治愈、服务发现等多种特性能力。 本文将带着大家快速了解 kubernetes ,了解我们谈论 kubernetes 都是在谈论什么。 一、背…...
GO-学习-02-常量
常量是不变的 const package main import "fmt"func main() {//常量定义时必须赋值const pi 3.1415926const e 2.718//一次声明多个常量const(a 1b 2c "ihan")const(n1 100n2n3)//n2,n3也是100 同时声明多个常量时,如果省略了值则表示和…...
Vue系列面试题
大家好,我是有用就扩散,有用就点赞。 1.Vue中组件间有哪些通信方式? 父子组件通信: (1)props | $emit (接收父组件数据 | 传数据给父组件) (2)ref | $refs&a…...
等级保护 总结2
网络安全等级保护解决方案的主打产品: HiSec Insight安全态势感知系统、 FireHunter6000沙箱、 SecoManager安全控制器、 HiSecEngine USG系列防火墙和HiSecEngine AntiDDoS防御系统。 华为HiSec Insight安全态势感知系统是基于商用大数据平台FusionInsight的A…...
关于Redis(热点数据缓存,分布式锁,缓存安全(穿透,击穿,雪崩));
热点数据缓存: 为了把一些经常访问的数据,放入缓存中以减少对数据库的访问频率。从而减少数据库的压力,提高程序的性能。【内存中存储】成为缓存; 缓存适合存放的数据: 查询频率高且修改频率低 数据安全性低 作为缓存的组件: redis组件 memory组件 e…...
【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第四十七章 字符设备和杂项设备总结回顾
i.MX8MM处理器采用了先进的14LPCFinFET工艺,提供更快的速度和更高的电源效率;四核Cortex-A53,单核Cortex-M4,多达五个内核 ,主频高达1.8GHz,2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…...
C#初级——枚举
枚举 枚举是一组命名整型常量。 enum 枚举名字 { 常量1, 常量2, …… 常量n }; 枚举的常量是由 , 分隔的列表。并且,在这个整型常量列表中,通常默认第一位枚举符号的值为0,此后的枚举符号的值都比前一位大1。 在将枚举赋值给 int 类型的…...
Linux 动静态库
一、动静态库 1、库的理解 库其实是给我们提供方法的实现,如上面的对于printf函数的实现就是在库中实现的,而这个库也就是c标准库,本质也是文件,也有对应的路径 2、区别 静态库是指编译链接时,把库文件的代码全部加入…...
微信小游戏之 三消(一)
首先设定一下 单个 方块 cell 类: 类定义和属性 init 方法 用于初始化方块,接收游戏实例、数据、宽度、道具类型和位置。 onWarning 方法 设置警告精灵的帧,并播放闪烁动作,用于显示方块的警告状态。 grow 方法 根据传入的方向…...
软件测试---Linux
Linux命令使用:为了将来工作中与服务器设备进行交互而准备的技能(远程连接/命令的使用)数据库的使用:MySQL,除了查询动作需要重点掌握以外,其他操作了解即可什么是虚拟机 通过虚拟化技术,在电脑…...
数据库之数据表基本操作
目录 一、创建数据表 1.创建表的语法形式 2.使用SQL语句设置约束条件 1.设置主键约束 2.设置自增约束 3.设置非空约束 4.设置唯一性约束 5.设置无符号约束 6.设置默认约束 7.设置外键约束 8.设置表的存储引擎 二、查看表结构 1.查看表基本结构 2.查看建表语句 三…...
利用OSMnx求路网最短路径并可视化(二)
书接上回,为了增加多路径的可视化效果和坐标匹配最近点来实现最短路可视化,我们使用图形化工具matplotlib结合OSMnx的绘图功能来展示整个路网图,并特别高亮显示计算出的最短路径。 多起终点最短路路径并计算距离和时间 完整代码#运行环境 P…...
双向门控循环神经网络(BiGRU)及其Python和MATLAB实现
BiGRU是一种常用的深度学习模型,用于处理序列数据的建模和预测。它是基于GRU(Gated Recurrent Unit)模型的改进版本,通过引入更多的隐藏层和增加网络的宽度,能够更好地捕捉复杂的序列数据中的模式。 背景:…...
【BUG】已解决:ERROR: Failed building wheel for jupyter-nbextensions-configurator
ERROR: Failed building wheel for jupyter-nbextensions-configurator 目录 ERROR: Failed building wheel for jupyter-nbextensions-configurator 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我…...
Unity UGUI 之 自动布局组件
本文仅作学习笔记与交流,不作任何商业用途 本文包括但不限于unity官方手册,唐老狮,麦扣教程知识,引用会标记,如有不足还请斧正 本文在发布时间选用unity 2022.3.8稳定版本,请注意分别 1.什么是自动布局组件…...
网络基础之(11)优秀学习资料
网络基础之(11)优秀学习资料 Author:Once Day Date: 2024年7月27日 漫漫长路,有人对你笑过嘛… 全系列文档可参考专栏:通信网络技术_Once-Day的博客-CSDN博客。 参考文档: 网络工程初学者的学习方法及成长之路(红…...
QT自定义无边框窗口(可移动控制和窗口大小调整)
QT是一个功能强大的跨平台开发框架,它提供了丰富的界面设计工具和组件。在界面开发中,QT窗口自带的标题栏无法满足我们的需求。我们就需要自定义无边框窗口,包括自定义标题栏和窗口大小调整功能。本文将介绍如何在QT中实现这些功能。 一、简…...
Typora 【最新1.8.6】版本安装下载教程 (轻量级 Markdown 编辑器),图文步骤详解,免费领取(软件可激活使用)
文章目录 软件介绍软件下载安装步骤激活步骤 软件介绍 Typora 是一款专为 Markdown 爱好者设计的文本编辑器,它结合了简洁的界面设计与强大的 Markdown 渲染能力,为用户提供了一个流畅、高效的写作环境。以下是对 Typora 更详细的介绍: 核心特…...
RxJava 面试题及其答案
以下是一个全面的 RxJava 面试题及其答案,涵盖了 RxJava 的各个方面,包括基本概念、操作符、线程管理、错误处理、背压处理等: 基本概念 1. RxJava 的基本概念和原理是什么? 答案: RxJava 是一个用于响应式编程的库…...
【Rust】所有权OwnerShip
什么是所有权 rust使用由编译器检查的一些规则构成的所有权系统来管理内存。且这不会影响程序的运行效率。 所有权规则 rust中每一个每一个值都有一个owner。在同一时刻,只能有一个owner。当这个owner超过范围,则该值会被丢弃。 String类型 为什么需…...
qt总结--翻金币案例
完成了一个小项目的在qt5.15.2环境下的运行,并使用NSIS editNSIS打包完成.有待改进之处:增加计时功能,随机且能通关功能,过关后选择下一关功能.打包后仅仅有安装包有图标 安装后应用图标并未改变 在qt .pro中有待改进对qt的基本操作和帮助文档有了基本的认识.对C制作小游戏有了…...
最清楚的 BIO、NIO、AIO 详解!
一、什么是 I/O? I/O 描述了计算机系统与外部设备(磁盘)之间通信的过程。 为了保证操作系统的稳定性和安全性,一个进程的地址空间划分为 用户空间(User space) 和 内核空间(Kernel space &…...
八股文学习第二天| HTTP请求报文和响应报文是怎样的,有哪些常见的字段?,HTTP有哪些请求方式?,GET请求和POST请求的区别?
1、HTTP请求报文和响应报文是怎样的,有哪些常见的字段? 答: HTTP报文分为请求报文和响应报文。 (1) 请求报文 请求报文主要由请求行、请求头、空行、请求体构成。 请求行包括如下字段: 方法(…...
C++初阶学习第四弹——类与对象(中)
目录 一. 类的默认成员函数 二.六种默认成员函数 1、构造函数 1.1 构造函数的作用 1.2 特性 1.3 默认构造函数 2、析构函数 2.1 析构函数的作用 2.2 析构函数的用法 3、拷贝构造函数 3.1 拷贝构造函数的作用 3.2 特征 3.3 默认拷贝构造函数 三.总结 类与对象&…...
【计算机网络】期末实验答辩
注意事项: 1)每位同学要在下面做过的实验列表中选取三个实验进行答辩准备,并将自己的姓名,学号以及三个实验序号填入共享文档"1(2)班答辩名单"中。 2)在答辩当日每位同学由老师在表…...
一步步教你学会如何安装VMare虚拟机(流程参考图)
前言:一步步教你安装VMare虚拟机(此版本为17.5。2版本)。 1、安装 2、确认协议 3、选择位置存放 4、选择第二个 5、都不选。 6、都选提供便捷操作 7、点击许可证,将密钥输入(可以在网络寻找自己版本的密钥ÿ…...
WebGoC题解(14) 151.(2017dloi小乙)第5题 巧克力甜度(sweet)
题目描述 妈妈买了n颗甜度不同的巧克力,规定小C只能吃最大甜度之和是S。 例如:有5颗巧克力,s6,每个的甜度分别为: 4 2 3 1 1,那么小C最多可以吃3颗。 请问你能帮小C计算一下最多能吃多少颗巧克力吗? 输入格…...
深入探索PHP框架:Symfony框架全面解析
1. 引言 在现代Web开发领域,PHP作为一种广泛使用的服务器端脚本语言,其框架的选择对于项目的成功至关重要。PHP框架不仅能够提高开发效率,还能确保代码的质量和可维护性。本文将深入探讨Symfony框架,这是一个功能强大且灵活的PHP…...
内卷的利与弊
“内卷”原指一类文化模式达到了某种最终的形态以后,既没有办法稳定下来,也没有办法转变为新的形态,而只能不断地在内部变得更加复杂的现象。经网络流传,很多大学生用其来指代非理性的内部竞争或“被自愿”竞争。现指同行间竞相付…...
用Java手写jvm之实现查找class
写在前面 完成类加载器加载class的三阶段,加载,解析,初始化中的加载😀😀😀 源码 。 jvm想要运行class,是根据类全限定名称来从特定的位置基于类加载器来查找的,分别如下:…...
【React】组件:全面解析现代前端开发的基石
文章目录 一、什么是组件?二、组件的类型三、组件的生命周期四、状态管理五、属性传递六、组合与继承七、最佳实践 在现代前端开发中,React 已成为开发者构建用户界面的首选框架之一。React 的强大之处在于其组件化设计,允许开发者将 UI 拆分…...
java学习--包装类
包装类 Boolean的关系图 Character关系图 其他关系图 包装类和基本数据转换 Debug进入之后可以看到底层代码如下 例题: 三元运算符是一个整体返回的数的类型看其中所含类型最高的那个是谁就会转成哪个 想要掌握这个这个知识,就要多看源码,直接…...
Python Django功能强大的扩展库之channels使用详解
概要 随着实时 web 应用程序的兴起,传统的同步 web 框架已经无法满足高并发和实时通信的需求。Django Channels 是 Django 的一个扩展,旨在将 Django 从一个同步 HTTP 框架转变为一个支持 WebSockets、HTTP2 和其他协议的异步框架。它不仅能够处理传统的 HTTP 请求,还可以处…...
推荐3款将相片变为动漫风格的免费AI工具推荐
toonme ToonMe是一款功能强大的在线和移动端应用,专门用于将照片转换成卡通风格图像。该工具利用先进的AI技术,能够快速识别照片中的面部特征,并进行智能处理,生成高清晰度的卡通肖像。 功能特点 ToonMe通过其内置的人工智能算法…...
【职业学习】高效工作法
文章目录 01 时间拳击02 非同步沟通03 批量处理04. 80/20法则05. 一次只做一件事 01 时间拳击 时间拳击(Time Boxing)核心是给每项任务创造一个时间限制,然后在固定的时间段内专注地完成这个任务。 不同于传统的待办事项清单:8点…...
【iOS】Tagged Pointer
目录 前言什么是Tagged Pointer?引入Tagged Pointer技术之前引入Tagged Pointer之后总结 Tagged Pointer原理(TagData分析)关闭数据混淆MacOS分析NSNumberNSString iOS分析 判断Tagged PointerTagged Pointer应用Tagged Pointer 注意点 Tagge…...
Mysql explain 优化解析
explain 解释 select_type 效率对比 MySQL 中 EXPLAIN 语句的 select_type 列描述了查询的类型,不同的 select_type 类型在效率上会有所差异。下面我们来比较一下各种 select_type 的效率: SIMPLE: 这是最简单的查询类型,表示查询不包含子查询或 UNION 操作。 这种查询通常是…...