【zookeeper核心源码解析】第四课:客户端与服务端读写的io核心流程
系列文章目录
【zookeeper核心源码解析】第一课:zk启动类核心流程序列图
【zookeeper核心源码解析】第二课:俯瞰QuorumPeer启动核心流程,实现选举关键流程
【zookeeper核心源码解析】第三课:leader与follower何时开始同步,如何同步数据
【zookeeper核心源码解析】第四课:客户端与服务端读写的io核心流程
【zookeeper核心源码解析】第四课:客户端与服务端读写的io核心流程
- 系列文章目录
- 1. 先看服务端初始化与连接构建的准备
- 2. 客户端代码
1. 先看服务端初始化与连接构建的准备
在第一节中,介绍到NIOServerCnxnFactory的初始化,该类其实就是专门为客户端读写数据准备的服务端。主要构建连接与数据读写。
c class NIOServerCnxnFactory extends ServerCnxnFactory implements Runnable
在run方法中构建连接与io读写,具体代码如下:
public void run() {while (!ss.socket().isClosed()) {try {selector.select(1000);Set<SelectionKey> selected;synchronized (this) {selected = selector.selectedKeys();}ArrayList<SelectionKey> selectedList = new ArrayList<SelectionKey>(selected);Collections.shuffle(selectedList);for (SelectionKey k : selectedList) {if ((k.readyOps() & SelectionKey.OP_ACCEPT) != 0) {SocketChannel sc = ((ServerSocketChannel) k.channel()).accept();InetAddress ia = sc.socket().getInetAddress();int cnxncount = getClientCnxnCount(ia);if (maxClientCnxns > 0 && cnxncount >= maxClientCnxns){LOG.warn("Too many connections from " + ia+ " - max is " + maxClientCnxns );sc.close();} else {LOG.info("Accepted socket connection from "+ sc.socket().getRemoteSocketAddress());sc.configureBlocking(false);SelectionKey sk = sc.register(selector,SelectionKey.OP_READ);NIOServerCnxn cnxn = createConnection(sc, sk);sk.attach(cnxn);addCnxn(cnxn);}} else if ((k.readyOps() & (SelectionKey.OP_READ | SelectionKey.OP_WRITE)) != 0) {NIOServerCnxn c = (NIOServerCnxn) k.attachment();c.doIO(k);} else {if (LOG.isDebugEnabled()) {LOG.debug("Unexpected ops in select "+ k.readyOps());}}}selected.clear();} catch (RuntimeException e) {LOG.warn("Ignoring unexpected runtime exception", e);} catch (Exception e) {LOG.warn("Ignoring exception", e);}}closeAll();LOG.info("NIOServerCnxn factory exited run method");}
2. 客户端代码
ClientCnxn 类是客户端的入口代码。
/*** This class manages the socket i/o for the client. ClientCnxn maintains a list* of available servers to connect to and "transparently" switches servers it is* connected to as needed.**/
里面的EventThread专本对数据进行异步读写。感兴趣可以从run()方法进去看
@Overridepublic void run() {try {isRunning = true;while (true) {Object event = waitingEvents.take();if (event == eventOfDeath) {wasKilled = true;} else {processEvent(event);}if (wasKilled)synchronized (waitingEvents) {if (waitingEvents.isEmpty()) {isRunning = false;break;}}}} catch (InterruptedException e) {LOG.error("Event thread exiting due to interruption", e);}LOG.info("EventThread shut down");}
相关文章:
【zookeeper核心源码解析】第四课:客户端与服务端读写的io核心流程
系列文章目录 【zookeeper核心源码解析】第一课:zk启动类核心流程序列图 【zookeeper核心源码解析】第二课:俯瞰QuorumPeer启动核心流程,实现选举关键流程 【zookeeper核心源码解析】第三课:leader与follower何时开始同步&#…...
强化学习蘑菇书笔记
绪论 强化学习就是一个智能体在一个不确定的环境中最大化它的奖励。智能体在一个环境中获取某个状态后,做一个动作,也称为决策,在环境中执行这个决策以后,会有一个奖励。尽可能多地获得更多的奖励。 强化学习概述 强化学习与监…...
《机器学习》——线性回归模型
文章目录 线性回归模型简介一元线性回归模型多元线性回归模型误差项分析一元线性模型实例完整代码 多元线性模型实例完整代码 线性回归模型简介 线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。 相关关系&…...
Linux(Centos 7.6)网卡信息没有了问题处理
1.问题现象 虚拟机打开后,使用ifconfig查看IP信息,虚拟机默认的网卡名称是ens33,ifconfig没有看到相关问题,远程连接工具Xshell也不能正常访问该虚拟机。 [rootnode1 ~]# ifconfig lo: flags73<UP,LOOPBACK,RUNNING> mtu…...
WEB攻防-通用漏洞-文件上传-js验证-MIME验证-user.ini-语言特征
目录 定义 1.前端验证 2.MIME验证 3.htaccess文件和.user. ini 4.对内容进行了过滤,做了内容检测 5.[ ]符号过滤 6.内容检测php [] {} ; 7.()也被过滤了 8.反引号也被过滤 9.文件头检测 定义 文件上传漏洞是指攻击者上传了一个可执行文件(如木马…...
mybatis-plus代码生成器
<!--mybatis-plus--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.2</version></dependency><!--mybatis-plus-generator 生成器--><depende…...
12.24-12.28Mysql锁阅读笔记
1.Mysql的锁有哪些种类 全局锁, 通过flush tables with read lock 应用场景是全局备份,备份的时候如果有两个表,备份 先备份了用户表,然后用户了商品,再备份商品表 那么商品表库存减少了,然而用户表的育儿…...
支持最新 mysql9的workbench8.0.39 中文汉化教程来了
之前在 B 站上发布了 mysql8 workbench 汉化教程,一年多来帮助很多初学者解决了不熟悉英文的烦恼。 汉化视频可以访问: 2024最新版mysql8.0.39中文版mysql workbench汉化 中文升级 旧版汉化报错解决_哔哩哔哩_bilibili MySql Workbench汉化_哔哩哔哩_…...
golang连接jenkins构建build
1.安装jenkins依赖 go get github.com/bndr/gojenkins2.代码 import ("context""file/utils/logs""github.com/bndr/gojenkins""github.com/gin-gonic/gin""net/http""time" )// 接收单个静态文件上线参数 type…...
SCAU高程进阶题(自用)
18711 字符串去重 Description 一个完全由小写字母组成的长度为n的字符串,现在要求你去除所有重复的字母,并将剩下的字母按从小到大的次序输出。 如输入baaadccaab,输出abcd。 输入格式 第一行一个整数n,表示字符串长度(0<n&…...
基于STM32F103控制L298N驱动两相四线步进电机
文章目录 前言一、模块参数二、接口说明三、准备工作四、直流电机驱动引脚接线效果展示 五、两相四线步进电机驱动步进电机相关概念拍数驱动时序引脚接线效果展示 六、参考示例 前言 L298N 是一种常见的双 H 桥电机驱动模块,广泛用于驱动直流电机和步进电机。它基于…...
libreoffice在Windows和Linux环境的安装和结合Springboot使用教程
前言: 在公司做开发时,遇到一个需求,要求上传的文件有图片,也有word和pdf。预览信息时,既要求能水印展示出来,又要求能大图水印预览。思索许久,我决定采取全部打水印然后转成图片Base64&#x…...
前端开发 -- 自动回复机器人【附完整源码】
一:效果展示 本项目实现了一个简单的网页聊天界面,用户可以在输入框中输入消息,并点击发送按钮或按下回车键来发送消息。机器人会根据用户发送的消息内容,通过关键字匹配来生成自动回复。 二:源代码分享 <!DOCTYP…...
vue+echarts实现疫情折线图
效果: 代码: <<template><div><div id"left1" style "height:800px;width:100%"></div></div> </template><script> //疫情数据//export default {data() {return {data:{//疫情数据…...
服务器nfs文件共享
1. 配置 NFS 服务器(NFS Server) 在 Ubuntu/Debian 上: sudo apt update sudo apt install nfs-kernel-server在 CentOS/RHEL 上: sudo yum install nfs-utils1.2 创建共享目录 选择一个要共享的目录,并确保该目录的权限正确设置。例如,假设我们要共享 /srv/nfs 目录…...
基于Vue+SSM+SpringCloudAlibaba的科目课程管理系统
功能1:科目列表 功能2:条件查询 功能3:分页查询 功能4:excel批量导入 功能5:修改 功能6:删除...
vue3配置caddy作为静态服务器,在浏览器地址栏刷新出现404
vue3配置caddy作为静态服务器,在浏览器地址栏刷新出现404 1 情况描述2 原因3 配置 1 情况描述 在vue打包之后,形成dist文件,采用caddy作为静态资源服务器。在浏览器中输入域名时可以访问网站,但是,进过路由导航栏内部…...
深入理解委托:C# 编程中的强大工具
在面向对象编程中,委托(Delegate) 是一个非常强大且灵活的概念,特别是在 C# 编程语言中。它不仅仅是函数指针的替代品,还提供了更高层次的抽象,使得代码更加简洁、灵活和可维护。在这篇博客中,我…...
【Java 数据结构】合并两个有序链表
🔥博客主页🔥:【 坊钰_CSDN博客 】 欢迎各位点赞👍评论✍收藏⭐ 目录 1. 题目 2. 解析 3. 代码实现 4. 小结 1. 题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示…...
基于微信小程序的校园访客登记系统
基于微信小程序的校园访客登记系统 功能列表 用户端功能 注册与登录 :支持用户通过手机号短信验证码注册和登录。个人资料管理 :允许用户编辑和更新个人信息及其密码。站内信消息通知:通知公告。来访预约:提交来访预约支持车牌…...
Qwen2.5-7B新手部署:如何用最简单的方法运行阿里大模型
Qwen2.5-7B新手部署:如何用最简单的方法运行阿里大模型 1. 引言 Qwen2.5-7B是阿里云最新开源的大语言模型,相比前代版本在知识量、编程能力和数学能力等方面都有显著提升。对于想要体验这款强大AI模型的新手来说,部署过程可能会显得有些复杂…...
Skill vs App:一场入口范式的争夺
田晏林 发自 凹非寺量子位 | 公众号 QbitAI中关村科学城国际创新服务集聚区的会议室,座无虚席。原定2点开始的沙龙活动,不少观众提前一个小时就到场。他们大多是从业多年的产品经理、创业者,也有大学生和刚入行的年轻人。OpenClaw带来的连锁反…...
基于SpringBoot开发的预约停车系统共享停车位小程序app
在城市化进程加速的今天,汽车保有量以年均数百万辆的速度激增,而停车位建设却始终滞后。据统计,我国一线城市核心区域车位缺口率普遍超过50%,医院、景区、商圈等场景“一位难求”的现象已成为制约城市运转效率的痛点。在此背景下&…...
Altium Develop是什么?
Altium Develop包括了Altium Designer 和Altium365。 加量还降价 🎁点击即可,立即免费试用60天🎁 工作区(workspace)是什么? 工作区是一个专用的安全环境,您可以在其中存储、版本控制和管理设…...
Typora笔记完美发布CSDN:图片自动上传+排版优化保姆级教程
Typora 图像上传 完整操作说明 发现问题 当我们使用Typora这款强大的Markdown编辑器记录笔记时,经常会遇到一个让人困扰的问题:在将笔记上传到CSDN博客或者其他网站上后,图片无法正确显示。这不仅会大大降低我们的效率,还可能给…...
PaddlePaddle-v3.3镜像测评:开箱即用的深度学习平台,到底有多方便?
PaddlePaddle-v3.3镜像测评:开箱即用的深度学习平台,到底有多方便? 1. PaddlePaddle-v3.3镜像初体验 1.1 为什么选择PaddlePaddle PaddlePaddle作为国内领先的深度学习框架,已经服务超过2185万开发者和67万家企业。最新发布的v…...
中科院FlowPIE:AI实现科学创意自动孵化突破研究范式创新
这项由中国科学院深圳先进技术研究院联合大连理工大学等多家科研院所开展的研究,发表于2026年3月31日的arXiv预印本平台(论文编号:arXiv:2603.29557v1),为科学创意生成领域带来了革命性突破。有兴趣深入了解的读者可以…...
别再傻傻分不清:DNS、RANS、LES到底该用FDM还是FVM来算?
湍流模拟方法选择指南:DNS、RANS、LES与FDM、FVM的实战搭配策略 在计算流体力学(CFD)的实际工程应用中,选择合适的湍流模型与数值方法是每个工程师都会面临的挑战。面对复杂的流体流动问题,如何在计算精度、资源消耗和…...
Ollama小白入门:从零开始使用Yi-Coder-1.5B,体验AI写代码
Ollama小白入门:从零开始使用Yi-Coder-1.5B,体验AI写代码 1. 为什么你需要Yi-Coder-1.5B 作为一个开发者,你是否经常遇到这些情况: 知道要实现什么功能,但写不出具体代码需要快速生成一些模板代码来节省时间学习新编…...
OpenClaw+千问3.5-9B社交媒体管理:定时发布与智能互动
OpenClaw千问3.5-9B社交媒体管理:定时发布与智能互动 1. 为什么选择OpenClaw管理社交媒体 去年我开始尝试运营技术类社交媒体账号时,每天要花2-3小时手动处理内容发布和粉丝互动。直到发现OpenClaw这个能直接操控我电脑的AI助手,配合千问3.…...
