<=点个赞再走吧,您的支持是我写题解的动力
鄙人才疏学浅,此中鄙陋甚多,望海涵。
更好的阅读效果
声明:
下方为文章整体纲要
课上代码:
https://git.acwing.com/ywxsdl/kobs/-/tree/d6585f88b3e985c20c062bef9797f344d02ca578
1、实现匹配系统的原理剖析
2、WebSocket协议与http协议区别
3、我们在云端维护游戏的整个流程
4、WebSocket协议原理剖析
5、集成WebSocket
6、实现从后端向前端发信息
7、WebSocketServer
8、配置config.SecurityConfig
9、加上jwt验证
10、实现前端页面
11、匹配界面布局
12、前端实现——开始实现具体逻辑
13、写匹配池
匹配过程
匹配系统就是一个单独的程序就类似于MySQL
生成地图的过程在用户本地、两名玩家在本地实现地图
地图就大概率不一样、需要将生成地图过程放在服务器中
Game任务需要生成统一的地图、Game第一步先生成一个地图CreateMap
有很多逻辑都需要在服务器端完成、判断蛇输赢的逻辑
当我们撞的时候死亡、如果在客户端用户本地就可以作弊
所以说我们整个游戏的过程应该都放到服务器端、不止生成地图这个过程
同时蛇的移动、蛇的判定、都要在服务器端统一完成
服务器端判断完之后再把结果返还给前端、前端只是用来花动画的
前端不做任何判定逻辑、并不是所有的游戏判定逻辑都在云端
回合制通信量比较少、比如吃鸡各种fps游戏在本地操作非常频繁
如果都在云端的话延迟会非常高、判断是否击中对方的逻辑判断就是在本地
所以要在游戏体验在用户作弊之间做一个权衡、锁头挂之类的
炉石所有逻辑判断都在云端、很难作弊
整个我们在云端维护游戏过程它的整个流程
![]()
1、实现匹配系统的原理剖析
都点击匹配向服务器发出请求匹配系统不会立即返回结果,一般会匹配个几秒
整个游戏是异步的过程,计算量比较大的过程,所以我们就另外写一个进程
后端接收的请求,会将用户的请求,发送给我们的匹配系统,匹配系统维护了一堆用户的集合
匹配系统里有很多很多的用户,将当前用户中战斗力最相近的几个人匹配到一起
然后将我们的匹配结果返回给网站后端返回给serverSpringBoot
返回之后我们的后端就会把结果返回给前端、我们在前端就可以看到匹配的对手是谁
整个匹配的过程其实是一个异步的过程、匹配的过程会经过一段比较长的时间
什么时候有匹配结果我们是未知的
2、WebSocket协议原理剖析
一问一答式http
问一次返回多次中间还有间隔时间用websocket协议
这种情况下我们的https就不能满足要求了、websocket协议
不仅客户端可以主动像服务器发送请求、服务器端也可以主动向客户端发送请求
是两遍对称的一个通信方式
3、我们在云端维护游戏的整个流程
先生成一个地图,将两个地图传给两个客户端,传完之后等待用户输入
waiting、我们可以从代码端获取下一步操作也可以客户端返还
代码端要用微服务了,waiting可以写一个死循环每次循环前先sleep一秒钟
然后判断一下是否两条蛇的下一步操作都有了、如果有的话进行下一步
如果没有的话继续等待、当然我们可以设定一个最大时间最大5s
如果5s之内没有得到下一步操作的话、我们就判断没有输入操作的蛇输
如果超时就判断输赢、如果获得输入写一个judging程序、判断是否合法和撞墙、这个游戏的逻辑
4、WebSocket协议原理剖析
基本原理就是、每一个连接我们都会在后端维护起来
我们会把前端建立的每一个websocket连接在后端维护起来,
比如我们的Clint1连接到我们的服务器、其实一个连接就是一个类
其实就是一个websocketserver类,每来一个连接,其实就是new一个这个类的实例
先创建这个类,我们每次来一个连接的时候本质上就是new一个这个类的实例
每一个连接都是这个类的一个实列来维护的、所有和这个连接相关的信息
都会存到这个类里面、如果是每一个连接自己独有的信息、比如说维护这个连接对应的用户是谁
那可以存成私有变量、如果是维护所有连接的公共信息
比如我们想去维护一下当前哪些用户建立的连接、那么可以存成一个静态变量
WebSocket就是一个多线程、每来一个连接就会开一个新的线程来维护它这个websocket就是一个类
每来一个连接就会开一个线程创建一个类,去维护这个连接流程
用户开始匹配的时候向后端发送一个请求、就会在后端websocket里new一个新的类开一个线程
来维护这个链接那么接收到这个请求之后、我们会把我们的信息发送给我们的匹配系统
匹配系统是一个单独的额外的程序、匹配系统当接收到很多的用户之后随着时间的推移
出现两名玩家的战斗力比较接近匹配出来一局、匹配系统就会将信息返回给我们的后端服务器
也就是我们的websocket服务器、websocket服务器接受到这个信息之后就会将这个信息返回
给这局对战的两名玩家、根据两名玩家建立的链接返还到他们的前端的浏览器里面
同时在我们的服务器端创建一个游戏的过程、因为整个游戏的判断地图的生成都是在云端进行的
这就是websocket的基本原理
5、集成WebSocket
在pom.xml文件中添加依赖:
spring-boot-starter-websocket
fastjson
6、实现从后端向前端发信息
从后端向前端怎么发信息、需要自己实现一下
首先用websocket的一个api、建立链接的时候需要把session存下来
如何从后端向前端发信息呢、写一个辅助函数,异步通信需要加一个锁
异步通信需要加一个锁、我们要知道这个链接对应的是谁
才知道谁跟谁匹配到一块了,另外我们还需要存储一下所有链接
因为当我们接收到一个信息之后,比如当我们从匹配系统接收到某一局匹配成功的信息之后
我们需要将这个消息发送给匹配成功的两名玩家、我们需要能够根据用户的id找到它对
应的链接是谁,才可以利用这个链接向前端发请求,所以对于所有的websocket可见的一个全局变量
用来存储所有的链接、对于所有的实列可见定义为静态变量
由于每个实例在每个线程里面,所以公共的变量是线程安全的用线程安全的哈希表
将userid映射到我们的websocket实例
7、WebSocketServer
当我们建立链接的时候我们需要从token中读取当前的用户是谁,
有了id之后去插数据库去查id是谁,查数据库注入userMapper
静态变量相当于是所有实例的一个全局变量,
如果不加静态变量的话那就是所有的实列所有独有一份,哈希表是对所有的实例都可见
每一个实例都要访问同一个哈希表,不加static 相当于局部变量
websocketserver,并不是一个标准的spring里的组件,注入的时候跟controller是有所区别的
静态变量访问的时候需要用类名访问
8、配置config.SecurityConfig
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/websocket/**");
}
配置config.SecurityConfig、然后去前端写一写调试一下整个过程
放行这一类所有链接、创建一个从后端到前端建立一个链接
需要当我们的组件加载出来的时候建立一个链接
把周期函数取出来、另外我们可以将socket存到另外一个变量里面
当当前组件被挂载的时候,我们需要创建一个链接
9、加上jwt验证
我们现在建立链接的时候、直接把用户id传过来就可以建立链接了
这样就可以实现一个身份的验证、如果可以正常解析出来的话就表示登录成功
10、实现前端页面
当前只有对战界面木有匹配界面、所以我们还需要实现一个匹配界面
实现切换、类似于roter,实现匹配界面
11、匹配界面布局
比较简单,直接上图
12、前端实现——开始实现具体逻辑
我们向后端发送一个请求、后端接收到请求之后将用户放到匹配池中
当匹配池子满了之后、返回给后端,后端返回给client
事件怎么区分呢,取消和开始匹配
13、写匹配池
代码见AcGit
orz
https://www.wangyesheng.online/
求增加活跃,15秒会排到人机,前端比较一般,有空会完善😀
orz
整个游戏是异步的过程
这是什么意思呢 大佬
应该是匹配的过程中,用户可以进行其他操作吗?我也不是很懂,有没有大佬解答一下。
应该是整个游戏是异步的过程”这个表述通常指的是游戏的设计和玩法允许玩家在不同的时间进行游戏活动,不需要所有玩家同时在线或同时进行操作
2.Websocket原理剖析中是http一问一答,不是https,好像是这样吧(狗头保命)
谢谢已丁真