news 2026/7/1 15:34:25

第一章Netty,NIO selector消息边界问题,附件和扩容

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
第一章Netty,NIO selector消息边界问题,附件和扩容

在 Java NIO 编程中,Selector 本身并不直接处理消息边界或缓冲区扩容,这些逻辑需要在应用层基于 SelectionKey 的 ‌附件(Attachment)‌ 机制来实现。由于 TCP 是流式协议,必须通过自定义协议解决‌粘包/拆包‌问题,并通过‌动态扩容‌应对大数据量场景。

以下是结合 Selector、Attachment 和扩容机制的完整解决方案:

一、核心架构设计

Attachment 的作用‌:
为每个 SocketChannel 绑定一个持久的 ByteBuffer(作为读缓冲区)。
避免每次 read 都新建对象,减少 GC 压力。
保存解析状态(如当前已读取的头信息、剩余长度等)。

消息边界处理(定长头+变长体)‌:协议定义前 4 字节为 int 类型的消息体长度‌。

步骤‌:
检查缓冲区是否有 4 字节,读取长度 len。
检查缓冲区剩余数据是否 >= len。
若不足,保留现场(mark/reset 或依靠 compact),等待下次数据到达。
若足够,提取完整消息并处理。

动态扩容机制‌:
当解析出的 len 大于当前缓冲区剩余空间时,创建更大的 ByteBuffer。
将旧数据拷贝到新缓冲区,并更新 key.attachment()。

二、关键代码实现

1. 初始化与注册

// 初始缓冲区大小privatestaticfinalintINITIAL_BUF_SIZE=1024;// 最大允许消息大小(防止 OOM)privatestaticfinalintMAX_MSG_SIZE=10*1024*1024;// 注册通道时绑定初始缓冲区SocketChannelchannel=serverSocketChannel.accept();channel.configureBlocking(false);ByteBufferbuffer=ByteBuffer.allocate(INITIAL_BUF_SIZE);SelectionKeykey=channel.register(selector,SelectionKey.OP_READ,buffer);

2. 读事件处理与扩容逻辑

if(key
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/1 15:32:32

76.从硬件 I/O 分配、时序设计到 ST 代码开发!PLC 多工位分拣项目全流程工程落地与常见问题避坑指南

摘要 可编程逻辑控制器是工业自动化领域的核心控制设备。本文从工程实践角度出发,系统讲解PLC的工作原理、I/O扫描机制、梯形图与结构化文本的编程范式,并通过一个完整的工业级案例——多工位分拣控制系统,展示从需求分析、硬件选型到代码实现的全流程。文中提供可直接运行…

作者头像 李华
网站建设 2026/7/1 15:31:17

2026年乌鲁木齐简装装修节能型企业top5,这家公司实践经验超棒!

在当今社会,节能环保的理念深入人心,装修行业也不例外。乌鲁木齐地区对简装装修节能型企业的需求日益增长,这些企业不仅能满足人们对装修的基本需求,还能在能源利用上做到高效、环保。以下是为大家整理的2026年乌鲁木齐简装装修节…

作者头像 李华
网站建设 2026/7/1 15:30:29

Vue3-Day2

一. 组件定义与父子组件传值 把页面拆成小块代码&#xff0c;一块独立功能就是组件&#xff0c;可以重复使用。 分两类&#xff1a; 父组件&#xff1a;引入、使用别人的组件 子组件&#xff1a;被引入、接收父传数据父组件<script setup lang"ts"> import Chi…

作者头像 李华
网站建设 2026/7/1 15:28:03

佛山网站设计哪个好

中小企业网站开发&#xff0c;选对合作伙伴比选“低价”更重要“网站开发哪家好&#xff1f;”这是许多中小企业在数字化转型路上遇到的第一个难题。面对动辄十万的报价、看不明白的技术文档、以及网站上花哨的承诺&#xff0c;很多老板心里都在犯嘀咕&#xff1a;这钱花得值吗…

作者头像 李华
网站建设 2026/7/1 15:23:23

说明 args.gn 与 WebView/Chromium 的关系 如何编译chromium

cd ~/chromium/src autoninja -j112 -C out/Chrome chrome_public_apk 编译完成后 产物路径&#xff1a; ~/chromium/src/out/Chrome/apks/ChromePublic.apk 拷到 00&#xff1a; cp ~/chromium/src/out/Chrome/apks/ChromePublic.apk ~/work//vendor/3rd/Chromium/Chromium.a…

作者头像 李华
网站建设 2026/7/1 15:20:11

什么 Context 才是 Agent 真正的“大脑“?一文讲透上下文工程

子玥酱 &#xff08;掘金 / 知乎 / CSDN / 简书 同名&#xff09; 大家好&#xff0c;我是 子玥酱&#xff0c;一名长期深耕在一线的前端程序媛 &#x1f469;‍&#x1f4bb;。曾就职于多家知名互联网大厂&#xff0c;目前在某国企负责前端软件研发相关工作&#xff0c;主要聚…

作者头像 李华