ET框架-18 ET框架登录账号请求逻辑编写(3)

1. 服务器处理消息优化

1.1 我们完善我们的账号登录错误ErrorCode

我们需要足够多的ErrorCode来方便我们客户端进行UI提示
因为客户端只有知道错误原因,才好去处理我们的消息
在这里插入图片描述

1.2 确保在 reply() 完成之后才能进行session.Dispose()

之前我们是直接调用Action委托的repy()方法,然后Dispose掉我们的Session
在这里插入图片描述
但是reply是通过网络发送消息给客户端,如果发送到一半被直接断开,客户端就接受不到消息,一直在等待

这里我们编写帮助类 DisconnectHelper

在这里插入图片描述
在这里插入图片描述
我们使用拓展方法来开启异步协程安全释放我们的Session
在这里插入图片描述
将下面所有的Session用同样的方法进行释放

1.3 解决用户多次点击登录 多次消息处理的bug

我们创建一个Session锁的组件
在这里插入图片描述
在这里插入图片描述
然后我们在消息进来的时候,判断session是否有SessionLockingComponent组件
在这里插入图片描述
然后我们把后面的 异步逻辑块 用using关键字括起来,使用完自动remove释放dispose我们的SessionLockingComponent组件

为什么是异步逻辑块?异步逻辑块是否执行完是不容易判断的,如果按同步的逻辑去处理,那么就会出问题。因为我们必须得让这条消息处理完了,才能进行下一条消息逻辑
前面3中的验证账户密码的正确性是同步逻辑,是直接执行完的
而下面的异步逻辑,是需要时间的
在这里插入图片描述

1.4 解决两个客户端同时登录并且使用相同的账号和密码

两条消息都会进入处理阶段,然后在数据库根据账号进行查询,都是为0,然后同时创建account账户,然后同时存入到数据库。
那么,当他们下次登录的时候,同学A可能会去登录到同学B的账户里面,会造成数据错乱
这就是数据库里面最重要的一个概念,就是唯一值,我们必须得保证账户是唯一的,才能避免这些情况的发生

使用协程锁
锁的是异步逻辑
进入这个异步逻辑,就会锁上,直到执行完,才会解锁,让下个逻辑进来
在这里插入图片描述
加个协程锁的类型,为我们的Account
在这里插入图片描述
同时这个协程锁必须是唯一的,我们得有唯一的id进行标识,那么此时session登录消息的账户名的hash值,就是最好的id

1.5 对一些组件使用完及时释放

比如我们查询数据库的临时实体变量,我们在不使用之后,就得进行判空然后dispose释放掉资源

在这里插入图片描述

1.6 在客户端避免玩家多次点击按钮

首先我们进入EUIHelper,在这里我们为按钮添加自己定义的listener
在这里插入图片描述
在这里插入图片描述
然后我们找到调用我们客户端登录事件的方法
在这里插入图片描述
我们把同步的添加Listener的方法,改为我们刚才的拓展方法
这里我们需要的参数是一个Action委托函数,所以我们这里使用lambda表达式,这个()=>{}里面的,就是我们传入进去的函数
在这里插入图片描述
然后我们就发现,我们需要的参数是一个需要返回值的异步函数,所以我们得修改我们的登录方法,将它从同步的调用Login,改为异步
在这里插入图片描述
这里面我们拿到服务器返回消息的ErrorCode,然后进行下一步处理
在这里插入图片描述

1.7 数据字段和逻辑进行分离

进入EUIHelper,在这里我们为按钮添加自己定义的listener的时候,我们定义了一个isClicked的静态字段,但是这个类是在HotfixView层,不允许存在数据字段

我们进行ModelView层,将字段复制到这里
在这里插入图片描述
我们把他定义成属性
在这里插入图片描述

然后我们得在这个UIEventComponent进行Destory的时候,置为false
在这里插入图片描述
然后定义给他赋值的拓展方法
在这里插入图片描述
现在我们将使用这个UIEventComponent单例来判断是否点击了UI
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_48781656/article/details/124891869