02-服务端基础框架与前后端网络通信

前言:moba对网络要求极其严苛,moba稍微有一点网络延迟就会对走路、释放技能等不顺畅,操作起来就会很别扭,一般游戏网络部分可以使用TCP协议,TCP协议可满足90%的网络游戏需求,但对于moba游戏而言使用TCP协议会有很大的问题,公网上面一丝的网络抖动或者TCP协议复杂的确认机制会导致速度比较慢,慢了几十毫秒就会影响moba游戏的操作手感。在公网上面跑基本上是没有办法玩的,就只能采用UDP协议,UDP协议天生就是不稳定的,发送了不一定收得到,所以以下是实现可靠的UDP通信

  • 17启动了服务器,创建HOKprotocol

  • 18核心敏感的数据为了保证游戏逻辑的安全,是必须放在单线程当中进行处理的。

比如登录的时候两个客户端同时登录,服务器应让第一个申请登录的客户端登录,第二个不允许。保障游戏逻辑数据安全的方法有两种,在OnReciveMsg接收到数据后就对其进行加锁处理,整个的NetSvc都是在单线程里面运行的;另外一种是整个逻辑都采用多线程处理,而在最终在数据库里边拿取数据修改数据的时候,对它进行单线程的操作确保数据的安全。 第一种比较简单,第二种涉及到许多的加锁解锁的操作

在此就使用第一种方法,对性能的影响并没有那么大

OnReciveMsg接收到数据以后,在NetSvc里面增加一个队列,把它所有的数据都放到队列里边,通过update进行循环驱动取出里面的数据一条一条进行循环解析,这样就能够保证其数据的安全。

服务端是服务多个客户端,必须要把对应到的ServerSession都把它存到queue当中,通过Session才能够知道是谁传过来的数据

  • 19想要服务器通信跑起来还必须完成客户端的通信部分

类库选择standard,这部分建议自己敲一遍多理解,难度:hard

20优化前两节的内容

客户端的网络层需要重置会调用到InitSvc(),将new client放到InitSvc()里,开发时各关键节点都需要打上日志,出问题可快速定位

整个游戏的通信过程中,每一条通信既是一个HOKMsg,登录或者技能都是一个HOKMsg,为了让HOKMsg识别里面的数据具体是用来干嘛的,我们可以通过消息嵌套的模式,比如说有个请求登录的消息,new一个HOKMsg将字段reqLogin(请求登录)进行赋值,reqLogin new出acct以及pass,将数值填进去即可。但如果服务器回应了一条消息,此时需将其嵌套进RspLogin(回应登录)

如何确认是req还是rsp,可以定义一个CMD通信协议的枚举,根据CMD就可以识别是什么消息

如果将HOKMsg里面的CMD置成了ReqLogin,当我们去读取这条消息的时候,就根据ReqLogin的CMD去读此字段。

当前账号若已登录,定义错误码ErrorCode enum

  • 21服务端处理登录请求

LoginSys.cs中的ReqLogin函数部分,首先要判定pack里边的data数据,data包含账号以及密码,当前账号在服务器里面有没有上线,如果已经上线要告诉这次连接的客户端,账号已经上线当前操作非法返回错误信息

  • 25请求匹配队列

不同的玩家请求,根据玩家的匹配类型(1V1、2V2、5V5)分配到不同的队列里边进行去处理,在队列里边满足了开辟一个房间的数量以后,这种情况就把它发送到一个房间里边AddPVPRoom。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值