- 博客(216)
- 收藏
- 关注
原创 【RabbitMQ】高级特性—幂等性保护、顺序性保护、消息积压问题详解
本文探讨了消息队列中的三个核心问题:幂等性保障、顺序性保障和消息积压问题。在幂等性方面,分析了重复消息可能导致的业务风险,并提出了全局唯一ID和业务逻辑判断两种解决方案。针对消息顺序性问题,阐述了单队列单消费者、分区消费等保障策略。对于消息积压问题,从生产者和消费者两端提出了提高处理效率、限流控制、资源优化等应对措施。文章强调,在实际应用中需要根据业务场景选择合适的技术方案,以平衡系统性能和可靠性要求。这些问题的解决对构建健壮的分布式系统具有重要意义。
2025-08-10 09:07:01
675
原创 【RabbitMQ】高级特性—事务、消息分发详解
RabbitMQ事务与消息分发机制摘要: RabbitMQ基于AMQP协议实现事务机制,通过Spring AMQP提供的RabbitTransactionManager可实现原子性消息操作。配置事务管理器后,使用@Transactional注解可确保消息发送的原子性(全部成功或失败)。 消息分发方面,RabbitMQ默认采用轮询方式,可能导致消费者负载不均。通过设置prefetchCount参数可实现: 限流控制 - 限制消费者未确认消息数量,防止系统过载 负载均衡 - 设置prefetch=1使消息均匀分
2025-08-09 09:36:53
1011
原创 【RabbitMQ】高级特性—TTL、延迟队列详解
本文介绍了RabbitMQ中TTL(Time to Live)的概念与应用。TTL可以为消息和队列设置过期时间,到期未消费的消息会被自动清除,适用于订单超时取消、自动退款等场景。文章详细讲解了两种设置TTL的方法:通过队列属性统一设置所有消息的TTL,或通过消息属性单独设置每条消息的TTL。同时对比了两种方式的区别,指出队列TTL会立即删除过期消息,而消息TTL只在投递时检查。最后介绍了如何结合TTL和死信队列实现延迟队列功能,给出了具体代码示例,包括队列声明、消息发送等关键步骤,展示了10秒和20秒不同延
2025-08-09 09:36:29
1236
原创 【RabbitMQ】高级特性—死信队列详解
摘要 死信(Dead Letter)是指无法被正常消费的消息,通常由消息被拒绝(requeue=false)、消息过期或队列达到最大长度三种情况产生。死信队列(DLQ)是与死信交换机(DLX)绑定的队列,用于存储这些死信。实现上,需要分别声明正常和死信的交换机和队列,并通过参数绑定。通过设置队列的TTL、最大长度等属性可以模拟死信产生。测试表明,当消息满足死信条件时会自动路由到死信队列,便于后续处理。这种机制为消息系统的容错和异常处理提供了有效解决方案。
2025-08-06 22:31:42
803
原创 【RabbitMQ】高级特性—发送方确认详解
RabbitMQ提供了两种消息发送确认机制:事务机制和confirm机制。本文重点介绍confirm确认模式,通过设置ConfirmCallback监听器来确保消息可靠投递。配置步骤包括:1)在RabbitMQ中启用publisher-confirm-type;2)创建带有ConfirmCallback的RabbitTemplate,用于处理消息发送成功/失败的回调;3)测试验证。当消息成功到达Exchange时返回ack=true,失败时返回ack=false并附带错误原因。这种方式相比事务机制性能更好,
2025-08-06 22:31:19
778
原创 【RabbitMQ】高级特性—持久性、重试机制详解
本文介绍了RabbitMQ的消息持久化机制和重试机制。消息持久化分为交换机持久化、队列持久化和消息持久化三部分,通过设置durable参数和deliveryMode确保消息在服务器重启后不丢失。需要注意的是,三者必须同时设置才能完全保证数据持久性,但会影响性能。此外,文章还介绍了RabbitMQ的重试配置,包括开启重试、设置间隔时间和最大重试次数,并提供了Java代码示例展示如何配置交换器、队列和绑定关系,以及如何发送持久化消息。这些机制共同提高了消息传递的可靠性,但需要根据业务场景在可靠性和性能之间进行权
2025-08-05 23:51:50
1018
1
原创 【RabbitMQ】高级特性—消息确认详解
消息确认机制是RabbitMQ确保消息可靠传递的重要功能。文章介绍了两种确认模式:自动确认(autoAck=true)和手动确认(autoAck=false)。自动确认适合对可靠性要求不高的场景,消息投递后立即删除;手动确认则需要消费者显式调用Basic.Ack命令,适合高可靠性场景。RabbitMQ会将未确认消息标记为Unacked状态,若消费者断开连接则重新入队。文章详细讲解了三种确认方法:basicAck(肯定确认)、basicReject(单条否定确认)和basicNack(批量否定确认),并提供了
2025-08-05 23:51:26
992
原创 【Spring】SpringBoot自动注入原理分析,@SpringBootApplication、@EnableAutoConfiguration详解
SpringBoot自动配置原理摘要 SpringBoot自动配置的核心在于@SpringBootApplication注解,它组合了三个关键注解: @SpringBootConfiguration:标记当前类为配置类 @EnableAutoConfiguration:核心自动配置注解 @ComponentScan:包扫描功能 @EnableAutoConfiguration通过@Import导入AutoConfigurationImportSelector类,该类会扫描META-INF/spring.fa
2025-08-04 22:33:31
832
1
原创 【Spring】SpringBoot 自动配置,@ComponentScan、@Import、ImportSelector接口
SpringBoot自动配置原理摘要 SpringBoot自动配置通过自动加载依赖jar包中的配置类和Bean到IoC容器,简化了开发配置。核心原理包括: Spring加载Bean的方式: 默认扫描启动类同包路径 通过@ComponentScan扩展扫描路径 使用@Import直接导入配置类或ImportSelector实现类 自动配置实现机制: 第三方依赖提供@EnableXxx注解(内含@Import) 通过ImportSelector接口动态返回需要加载的配置类 避免手动配置,由依赖方自行管理所需Be
2025-08-04 22:31:02
929
原创 【Spring】Bean的生命周期,部分源码解释
Bean 生命周期概述 Bean 的生命周期包含 5 个阶段: 实例化:通过构造函数创建对象 属性赋值:完成依赖注入(如 @Autowired) 初始化: 执行 Aware 接口回调(BeanNameAware 等) 调用初始化方法(@PostConstruct、init-method) 执行 BeanPostProcessor 后置处理 使用 Bean 销毁:触发 @PreDestroy、DisposableBean 或 destroy-method 执行流程 源码通过 doCreateBean() 方法
2025-08-03 21:42:30
463
原创 【Spring】Bean的作用域(单例、多例、请求、会话、Application)
本文介绍了Spring中Bean的六种作用域及其使用场景。重点展示了单例(singleton)和原型(prototype)作用域的区别:单例模式下多次获取的是同一个实例,而原型模式每次都会创建新实例。通过代码示例演示了如何通过@Scope注解配置不同作用域,包括请求作用域(request)、会话作用域(session)和全局作用域(application)等Web环境特有的作用域。测试结果表明,单例作用域下对象地址相同,属性修改会相互影响;而原型作用域每次都会创建新对象。文章还提到Web环境特定作用域需要配
2025-08-03 21:41:58
577
原创 【Spring】日志配置、日志持久化、配置文件分割、日志格式
日志配置摘要 文章介绍了Spring Boot日志系统的配置方法,主要包括: 日志级别设置:通过logging.level配置不同级别的日志输出 日志持久化:支持配置文件名或目录两种方式将日志保存到文件 日志分割:设置文件大小阈值自动分割日志文件 日志格式:可自定义控制台和文件日志的显示格式 简化日志输出:使用Lombok的@Slf4j注解替代LoggerFactory.getLogger 关键配置项包括日志级别、文件路径、分割策略和输出格式等,支持通过application.yml灵活调整日志行为。文章还
2025-07-29 20:35:46
672
原创 【Spring】日志级别的分类和使用
日志级别用于区分信息的严重性,帮助开发者高效筛选关键日志。常见的级别从高到低依次为:FATAL(致命系统错误)、ERROR(高优先级错误)、WARN(警告)、INFO(常规信息)、DEBUG(调试)、TRACE(详细追踪)。SpringBoot默认使用Logback框架,其日志输出级别默认为INFO,因此仅显示INFO及以上级别的日志。开发人员需根据经验合理设置级别,错误的级别设定可能影响问题判断。FATAL级别表示系统不可用需紧急处理,而ERROR日志较多未必代表系统问题。
2025-07-29 20:35:13
714
原创 【Spring】日志框架介绍、门面模式和SLF4J框架介绍
SLF4J是一个日志门面框架,它通过门面模式为各种日志实现(如Log4j、Logback)提供统一的API接口。不同于具体日志实现,SLF4J只是一个抽象层,需要配合具体日志框架使用。门面模式通过定义高层接口简化了子系统(具体日志框架)的调用,具有降低系统耦合、提高灵活性和安全性的优点。使用SLF4J可以避免项目中多套日志框架共存带来的维护问题,使应用程序代码独立于具体日志实现。典型的日志输出包含时间、级别、进程ID、线程名、Logger名和日志内容等信息。
2025-07-28 09:01:56
881
原创 【Spring】日志的介绍和用途
日志是软件开发中重要的调试和分析工具,不仅用于定位问题,还具有系统监控、数据采集、安全审计等功能。相比简单的System.out.print,专业的日志框架如Slf4j能提供更丰富的日志信息。在SpringBoot项目中,可以通过LoggerFactory获取日志对象,使用info()等方法记录日志,为系统运维、数据分析和安全审计提供支持。日志能记录用户操作、系统状态等关键信息,有助于问题追溯、性能监控和合规审计,是项目开发中不可或缺的组成部分。
2025-07-26 09:35:43
726
原创 【Spring】事务传播机制使用各种场景演示
本文主要介绍了Spring事务的四种传播机制及其使用场景。重点讲解了REQUIRED和REQUIRES_NEW两种常用传播机制:REQUIRED是默认值,多个方法共享同一事务,任一方法异常会导致全部回滚;REQUIRES_NEW每次创建新事务,互不影响。此外还演示了NEVER(不支持事务)和NESTED(嵌套事务)的特性,特别是NESTED通过捕获异常可实现部分事务回滚,与REQUIRED的全局回滚形成对比。通过代码示例展示了不同传播机制下事务的执行效果,帮助理解Spring事务管理的核心机制。
2025-07-26 09:35:03
661
原创 【Spring】@Transcational的作用和使用细节、rollbackFor
Spring的@Transactional注解提供声明式事务管理,只需在方法或类上添加该注解即可自动管理事务:方法执行前开启事务,执行后提交事务,出现未捕获异常时回滚。文章通过用户注册示例演示了事务的基本使用,并指出异常捕获会导致事务提交而非回滚。介绍了两种回滚方式:重新抛出异常或手动调用setRollbackOnly()。重点解析了@Transactional的三个关键属性:rollbackFor(指定触发回滚的异常类型)、isolation(隔离级别)和propagation(传播机制),并通过代码示例
2025-07-25 09:40:03
601
原创 【Spring】事务的隔离级别,Spring的事务隔离级别和事务传播机制
本文回顾了MySQL的四种事务隔离级别(读未提交、读提交、可重复读、串行化),并介绍了Spring框架中的五种事务隔离级别和七种事务传播机制。MySQL的隔离级别解决了并发事务的数据一致性问题,而Spring的事务传播机制则处理了事务在方法调用间的传递行为。文章详细说明了每种传播机制的特点,如REQUIRED(默认)、REQUIRES_NEW(创建新事务)等,并通过源码展示了Spring中枚举类的实现方式。最后提到可以通过@Transactional注解的isolation和propagation属性来设置
2025-07-25 09:39:47
645
原创 【Spring】什么是事务,Spring中事务的实现
Spring事务管理摘要:事务是数据库操作的不可分割单元,确保一组操作同时成功或失败。Spring提供编程式和声明式事务管理,前者手动控制事务,后者通过注解自动处理。本文以用户注册为例,演示了事务的必要性(如转账、秒杀系统),并展示了Spring事务的实现方式,包括数据准备、代码示例及事务操作步骤(开启/提交/回滚)。
2025-07-24 11:15:04
759
原创 【Spring AOP】动态代理的实现,JDK(InvocationHandler),CGLib详解
动态代理相比静态代理更灵活,能够在运行时根据需要动态生成代理对象。Java提供了两种实现方式:JDK动态代理和CGLIB动态代理。JDK动态代理通过InvocationHandler接口和Proxy.newProxyInstance()方法实现,但只能代理接口实现类;而CGLIB通过继承方式实现代理,适用于无接口的类,使用MethodInterceptor接口和Enhancer.create()方法创建代理对象。动态代理技术广泛应用于框架开发中,掌握它对理解框架原理很有帮助。
2025-07-24 11:14:51
537
原创 【Spring AOP】代理模式的定义,静态代理的实现
本文介绍了代理模式及其在Spring AOP中的应用。代理模式通过代理类间接访问目标对象,分为静态代理和动态代理两种。静态代理在编译前就确定代理类,灵活性差,需要为每个目标方法手动实现增强逻辑。动态代理则在运行时通过反射机制生成代理类,更加灵活。文章以房屋租赁为例,演示了静态代理的实现过程,并指出其局限性——当接口或业务类修改时,代理类也需同步调整。最后提出动态代理可以解决这一问题,实现一个代理类处理多种业务场景。
2025-07-18 15:13:21
536
1
原创 【Spring AOP】execution表达式,@annotation注解,@MyAspect(自定义注解),切面类
本文介绍了AOP切点表达式的两种主要语法:execution表达式和@annotation表达式。execution表达式通过方法签名匹配,语法包含访问修饰符、返回类型、包名类名方法名及参数等元素,支持通配符*和..进行灵活匹配,并提供了多个示例。@annotation表达式则通过自定义注解匹配无规则方法,详细说明了自定义注解的创建、切面类定义及注解使用步骤。两种方式各有适用场景,execution适合有规则的方法匹配,@annotation适合分散的无规则方法匹配。文章还简要提及了Spring AOP的实
2025-07-15 17:20:13
496
2
原创 【Spring AOP】通知类型,@Pointcut、@Order(切面优先级)
Spring AOP 通知类型与切面实践 本文介绍了Spring AOP的五种通知类型: @Around环绕通知(目标方法前后执行) @Before前置通知(方法前执行) @After后置通知(方法后执行,无论异常) @AfterReturning返回后通知(正常返回后执行) @AfterThrowing异常通知(出现异常后执行) 通过代码示例演示了各种通知的执行顺序和异常场景下的差异,并介绍了@Pointcut注解提取公共切点表达式的方法,以及使用@Order控制多个切面执行顺序的技巧。关键注意点包括环绕
2025-07-13 16:21:32
365
2
原创 【Spring AOP】什么是AOP?切点、连接点、通知和切面
AOP 概述与 Spring AOP 详解 AOP(面向切面编程)是 Spring 框架的第二大核心,是一种面向特定方法编程的思想,通过集中处理某一类问题实现解耦。Spring AOP 是其一种实现方式,相比拦截器能更细致地拦截方法(按包、类、方法等),典型应用如接口耗时统计。 核心概念 切点(Pointcut):定义拦截规则的表达式(如 execution(* com.example.controller.*.*(..)))。 连接点(Join Point):满足切点表达式的方法(如 Controller
2025-07-12 18:02:11
1922
26
原创 【Spring】拦截器详解
摘要:本文介绍了Spring拦截器在实现强制登录功能中的应用。传统方法需要在每个接口中校验Session,导致代码重复且维护困难。通过拦截器可以统一拦截请求并进行Session校验,简化开发流程。文章详细讲解了拦截器的定义(实现HandlerInterceptor接口)、配置(注册路径规则)以及执行流程(preHandle/postHandle/afterCompletion)。特别展示了如何用拦截器实现登录校验功能,通过检查Session中的用户信息来决定是否放行请求。这种方案相比传统方法更加高效、可维护
2025-07-11 17:28:35
1366
11
原创 【MyBatis】动态SQL,<if>、<trim>、<where>、<set>、<foreach>、<include>
本文介绍了MyBatis中常用的动态SQL标签及其用法。主要包括: <if>标签:用于条件判断,处理非必填字段的动态SQL拼接 <trim>标签:结合prefix、suffix等属性,灵活处理多字段动态插入 <where>标签:自动生成WHERE子句,并去除开头多余的AND/OR <set>标签:用于UPDATE语句,动态生成SET部分 <foreach>标签:遍历集合参数,常用于IN条件 <include>标签:抽取重复SQL片段,提
2025-07-10 17:41:53
1037
1
原创 【MyBatis】进行多表查询,#{}和&{}的区别,数据库连接池
本文介绍了MyBatis中的多表查询操作、#{}与${}的区别以及数据库连接池的相关知识。在多表查询部分,通过文章表和用户表的关联查询示例,展示了如何通过SQL和Mapper实现跨表数据获取。#{}采用预编译方式更安全高效,而${}直接拼接SQL存在注入风险。数据库连接池方面,对比了Hikari和Druid两种主流方案,说明连接池在资源复用和性能提升上的优势。最后总结了MySQL开发规范,包括命名规则、必备字段和查询优化建议,强调统一命名、自增主键和避免使用SELECT *等重要实践原则。
2025-07-09 15:07:11
857
6
原创 【MyBatis】XML实现,配置方法和增、删、改、查
MyBatis框架支持注解和XML两种开发方式,简单功能建议使用注解,复杂SQL推荐XML配置。XML方式需要配置数据库连接和编写持久层代码,包括接口定义和XML实现。增删改查操作通过XML标签实现,需注意参数传递、自增ID返回及结果映射问题。查询时字段名与属性名不一致可通过别名、结果映射或开启驼峰命名解决。XML文件需与接口对应,namespace设置为接口全限定名,SQL语句中的id与接口方法名一致。
2025-07-07 20:40:30
919
6
原创 【MyBatis】实现数据库的增、删、改、查
本文介绍了MyBatis中增删改查(CRUD)的基本操作实现。在插入操作中,演示了如何通过@Insert注解实现数据插入,并利用@Options注解获取自增主键;删除操作使用@Delete注解完成;更新操作通过@Update注解实现。重点说明了查询操作中数据库字段与Java对象属性不一致时的三种解决方案:1)通过SQL别名对应属性名;2)使用@Results注解进行结果映射;3)配置自动驼峰转换规则。文中提供了完整的代码示例,包括Mapper接口定义和测试方法,帮助开发者理解MyBatis的基本CRUD操作
2025-07-06 14:43:14
820
6
原创 【MyBatis】什么是MyBatis,怎么配置数据库
MyBatis是一款优秀的持久层框架,简化JDBC开发,主要用于数据库操作。摘要内容如下: MyBatis简介:作为持久化框架,简化程序与数据库交互,更便捷地操作数据库。 基础配置: 添加MyBatis和MySQL驱动依赖 配置数据库连接信息(URL、用户名、密码等) 通过@Mapper接口定义数据库操作方法 核心功能: 使用@Select等注解实现SQL映射 #{parameter}方式传递参数 可配置日志打印SQL执行过程 使用规范: 企业级建表规范(小写字段名、必含时间字段等) 常见问题排查(SQL错
2025-07-02 20:12:26
881
15
原创 【Spring】应用分层,MVC和三层架构的区别和联系,高内聚低耦合
应用分层是一种软件设计思想,将系统划分为不同层次,各层职责明确,协同工作。早期项目通常不分层,但随着业务复杂度增加,会出现逻辑混乱、模块依赖等问题。常见的分层方式包括MVC模式(模型、视图、控制器)和三层次架构(表现层、业务逻辑层、数据层)。二者目标一致,强调高内聚低耦合,但角度不同:MVC侧重数据与视图分离,三层次架构注重各层解耦。分层的好处包括降低依赖、提升复用性、便于维护和标准化开发。企业开发中还需遵循命名规范,如类名用大驼峰、方法名用小驼峰等,确保代码统一性。
2025-06-23 10:19:58
623
原创 [网页五子棋][匹配模块]实现胜负判定,处理玩家掉线
本文摘要: 解决了多例对象Room无法使用@Autowired自动注入的问题,通过在主类保存Spring上下文,在Room构造方法中手动获取依赖对象。 实现了五子棋胜负判定逻辑: 以落子点为中心,检查行、列、对角线是否存在五连珠 采用特定偏移量检查5种可能的连线情况 使用try-catch处理棋盘边界越界情况 判定结果为玩家ID或0(未分胜负) 关键点: 多例对象依赖注入的特殊处理 优化判定算法(只检查相关区域) 完整覆盖四种连线方向(水平、垂直、对角线)
2025-06-04 21:53:18
1187
9
原创 [网页五子棋][匹配对战]落子实现思路、发送落子请求、处理落子响应
本文介绍了五子棋游戏落子功能的实现思路,主要分为客户端和服务器两部分: 客户端点击棋盘时发送落子请求(包括用户ID和坐标),服务器更新内部棋盘状态并进行胜负判定; 服务器维护15x15的二维数组棋盘,其中0表示空位,1和2分别标记两个玩家的落子; 服务器处理流程包括:验证落子位置、更新棋盘、胜负判定、广播响应结果; 客户端收到响应后绘制棋子,避免直接在客户端判定胜负以防止作弊; 服务器需处理断线情况,游戏结束后更新玩家分数并销毁房间。 文中还对比了服务器和客户端棋盘的差异,强调了关键游戏逻辑应在服务器端处理
2025-06-02 23:15:34
1025
9
原创 [网页五子棋][对战模块]处理连接成功,通知玩家就绪,逻辑问题(线程安全,先手判定错误)
摘要: 本文实现了一个游戏房间的连接管理逻辑,通过afterConnectionEstablished方法处理玩家WebSocket连接。首先验证用户登录状态和房间匹配情况,禁止多开连接。当两名玩家成功连接后,服务器会通过noticeGameReady方法通知双方准备就绪。此外,针对线程安全问题,需对房间对象加锁以确保玩家加入顺序的正确性。整个流程覆盖了连接验证、多开限制、双人匹配和状态通知等核心功能,为后续对战模块提供基础支持。(150字) 关键词: WebSocket、游戏房间、连接管理、多开检测、线程
2025-06-01 23:20:19
699
3
原创 [网页五子棋][对战模块]实现游戏房间页面,服务器开发(创建落子请求/响应对象)
五子棋游戏房间实现摘要 本文介绍了五子棋游戏房间页面的实现过程,包含前端页面和WebSocket通信的开发: 前端页面实现: 创建了game_room.html和配套CSS样式 设计了棋盘区域和状态显示区域 页面包含一个450×450像素的canvas棋盘和状态提示框 WebSocket通信实现: 建立了客户端与游戏服务器的WebSocket连接 实现了连接建立、关闭和错误处理逻辑 开发了服务器返回消息的处理机制 包括游戏就绪响应、玩家信息同步和棋盘初始化 服务器端开发: 创建了GameAPI类处理WebS
2025-06-01 00:00:28
691
12
原创 [网页五子棋][对战模块]前后端交互接口(建立连接、连接响应、落子请求/响应),客户端开发(实现棋盘/棋子绘制)
摘要:本文介绍了五子棋游戏前后端交互接口的设计与客户端开发实现。接口采用两套WebSocket路径分别处理对战和匹配模块,保持低耦合。前端通过Canvas绘制棋盘和棋子,使用二维数组存储落子状态,并实现点击落子逻辑。后端负责生成房间ID、玩家信息及胜负判定,通过JSON格式消息进行数据交换。关键交互包括游戏准备通知和落子请求/响应,客户端代码处理棋子绘制、回合切换等游戏逻辑。整体设计兼顾功能实现与开发便利性。
2025-05-30 23:22:09
697
17
原创 [网页五子棋][匹配模式]创建房间类、房间管理器、验证匹配功能,匹配模式小结
摘要: 本文介绍了游戏房间管理系统的设计与实现。通过创建Room类管理玩家对战信息,使用UUID生成唯一房间标识,并利用RoomManager以哈希表形式管理多个房间。匹配功能通过Matcher处理玩家队列,并自动分配房间。验证过程中发现匹配按钮状态未更新问题,原因是服务器未返回响应,修复后功能正常。此外,针对用户多开登录问题,优化前端提示机制,确保单一账号登录体验。系统采用哈希表高效管理房间与玩家映射,支持快速查询与操作。
2025-05-30 23:18:54
1486
35
原创 [网页五子棋][匹配模块]处理开始匹配/停止匹配请求(匹配算法,匹配器的实现)
摘要:本文介绍了游戏匹配系统的设计与实现。系统通过WebSocket处理玩家匹配请求,分为三个分数段位队列(Normal、High、VeryHigh)进行匹配。核心功能包括:1) 解析客户端匹配请求并分类处理;2) 使用Matcher类管理三个匹配队列,提供增删玩家方法;3) 通过独立线程持续扫描队列,将同等级玩家两两配对。系统还处理了连接异常情况,确保玩家断开时自动移出队列。匹配算法采用简单分段策略,未来可扩展更精确的匹配机制。代码实现展示了具体的Java处理逻辑,包括请求解析、队列操作和线程调度。
2025-05-29 22:55:08
1280
11
原创 [网页五子棋][匹配模块]用户管理器可能存在的问题以及解决办法(线程安全、多开问题)
本文解决了WebSocket游戏大厅中的两个关键问题:线程安全和账号多开。 线程安全问题通过将存储用户在线状态的HashMap替换为线程安全的ConcurrentHashMap来解决,确保多线程环境下用户连接状态的正确管理。 针对账号多开问题,采取了禁止策略:当检测到同一账号重复登录时,直接拒绝新连接并关闭会话。同时在连接关闭处理中优化了用户下线逻辑,确保只移除当前会话对应的用户,防止误删其他会话。通过双重验证(获取会话比较和异常处理)保证了用户状态管理的准确性和健壮性。
2025-05-29 22:49:08
484
1
原创 [网页五子棋][匹配模块]服务器开发、用户管理器(创建匹配请求/响应对象、处理连接成功、处理下线)
文章摘要:本文介绍了五子棋游戏中的WebSocket匹配功能实现。通过MatchAPI类处理WebSocket请求,使用WebSocketConfig配置类注册匹配路径并传递HttpSession数据。开发了OnlineUserManager管理用户在线状态,维护玩家WebSocket会话。同时设计了MatchRequest和MatchResponse类来处理匹配请求和响应,完成完整的匹配流程功能实现。
2025-05-28 23:58:21
825
17
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人