ET框架学习——消息系统之三

2024-04-16 21:58

本文主要是介绍ET框架学习——消息系统之三,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

       鉴于我之前对于游戏的网络开发部分没有经验。后面关于ET消息系统的学习都将参考这位朋友Norman_Lin的博客来学习。后面会自己再来调整文章的顺序,结构等。

  • CircularBuffer

      这个应该是ET框架中消息相关的类,继承自Stream类。ChunkSize字段的代表一个字节数组的最大长度。后面两个队列应该是用于存储消息流的。

public int ChunkSize = 8192;
private readonly Queue<byte[]> bufferQueue = new Queue<byte[]>();
private readonly Queue<byte[]> bufferCache = new Queue<byte[]>();
public int LastIndex { get; set; }
public int FirstIndex { get; set; }
private byte[] lastBuffer;

 Length字段的定义和bufferQueue队列的长度有关,撇开特殊情况不说,结果如下:

 Lenght = (this.bufferQueue.Count - 1) * ChunkSize + this.LastIndex - this.FirstIndex;

     CircularBuffer在实例化是会执行AddLast方法,会将bufferCache队列中的对头元素弹出(不存在则创建一个空的元素,长度为ChunkSize),做两次赋值:

this.bufferQueue.Enqueue(buffer);
this.lastBuffer = buffer;

       后面还有几个对bufferQueue队列做操作的方法,获取bufferQueue队列的对头和队尾元素,移除对头元素(重新压入bufferCache队列中)。

       后面的几个方法是对字节数组和Stream间的互相操作,关于Stream类,可以参考这篇文章。Write方法用于将steam流写入到bufferQueue队列的尾部字节数组中去。在获取到流中还有数据后,通过一个While循环来写数据(alreadyCopyCount 和count做判断)。当字节数组还有位置时,就从流中写入数据到数组中去。Read方法用于将bufferQueue队列的头部字节数组中的数据转入到流中去。逻辑和Write方法差不多,就是反一下。

// 从stream写入CircularBuffer
public void Write(Stream stream)
{int count = (int)(stream.Length - stream.Position);   // 当前流中剩下的数据长度int alreadyCopyCount = 0;   // alreadyCopyCount 代表已经从流中写入的长度(临时的)while (alreadyCopyCount < count){// this.LastIndex是一个游标,代表已经写入到数组中的数据长度if (this.LastIndex == ChunkSize){// 对队列扩容this.AddLast();this.LastIndex = 0;}int n = count - alreadyCopyCount;  // n 代表流中还未写入的数据的长度// 数组的长度 - 已经写入的长度 > 流中还未写入的数据的长度if (ChunkSize - this.LastIndex > n)  {stream.Read(this.lastBuffer, this.LastIndex, n);//  写入完成后的长度this.LastIndex += count - alreadyCopyCount;alreadyCopyCount += n;}else // 数组中的长度不够,先写满,然后扩容再将剩余的写入{stream.Read(this.lastBuffer, this.LastIndex, ChunkSize - this.LastIndex);alreadyCopyCount += ChunkSize - this.LastIndex;this.LastIndex = ChunkSize;}}
}

 

这篇关于ET框架学习——消息系统之三的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/910007

相关文章

linux系统中java的cacerts的优先级详解

《linux系统中java的cacerts的优先级详解》文章讲解了Java信任库(cacerts)的优先级与管理方式,指出JDK自带的cacerts默认优先级更高,系统级cacerts需手动同步或显式... 目录Java 默认使用哪个?如何检查当前使用的信任库?简要了解Java的信任库总结了解 Java 信

Java 缓存框架 Caffeine 应用场景解析

《Java缓存框架Caffeine应用场景解析》文章介绍Caffeine作为高性能Java本地缓存框架,基于W-TinyLFU算法,支持异步加载、灵活过期策略、内存安全机制及统计监控,重点解析其... 目录一、Caffeine 简介1. 框架概述1.1 Caffeine的核心优势二、Caffeine 基础2

Oracle数据库在windows系统上重启步骤

《Oracle数据库在windows系统上重启步骤》有时候在服务中重启了oracle之后,数据库并不能正常访问,下面:本文主要介绍Oracle数据库在windows系统上重启的相关资料,文中通过代... oracle数据库在Windows上重启的方法我这里是使用oracle自带的sqlplus工具实现的方

JWT + 拦截器实现无状态登录系统

《JWT+拦截器实现无状态登录系统》JWT(JSONWebToken)提供了一种无状态的解决方案:用户登录后,服务器返回一个Token,后续请求携带该Token即可完成身份验证,无需服务器存储会话... 目录✅ 引言 一、JWT 是什么? 二、技术选型 三、项目结构 四、核心代码实现4.1 添加依赖(pom

GSON框架下将百度天气JSON数据转JavaBean

《GSON框架下将百度天气JSON数据转JavaBean》这篇文章主要为大家详细介绍了如何在GSON框架下实现将百度天气JSON数据转JavaBean,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言一、百度天气jsON1、请求参数2、返回参数3、属性映射二、GSON属性映射实战1、类对象映

基于Python实现自动化邮件发送系统的完整指南

《基于Python实现自动化邮件发送系统的完整指南》在现代软件开发和自动化流程中,邮件通知是一个常见且实用的功能,无论是用于发送报告、告警信息还是用户提醒,通过Python实现自动化的邮件发送功能都能... 目录一、前言:二、项目概述三、配置文件 `.env` 解析四、代码结构解析1. 导入模块2. 加载环

linux系统上安装JDK8全过程

《linux系统上安装JDK8全过程》文章介绍安装JDK的必要性及Linux下JDK8的安装步骤,包括卸载旧版本、下载解压、配置环境变量等,强调开发需JDK,运行可选JRE,现JDK已集成JRE... 目录为什么要安装jdk?1.查看linux系统是否有自带的jdk:2.下载jdk压缩包2.解压3.配置环境

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

聊聊springboot中如何自定义消息转换器

《聊聊springboot中如何自定义消息转换器》SpringBoot通过HttpMessageConverter处理HTTP数据转换,支持多种媒体类型,接下来通过本文给大家介绍springboot中... 目录核心接口springboot默认提供的转换器如何自定义消息转换器Spring Boot 中的消息

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.