00:01
大家好,欢迎来到自己教育课程的学习,本系列课程呢是自己教育的第一季,从零开始搭建游戏服务器,本节课呢是第十务节,给大家讲一下游戏服务器的心跳原理和实现啊。两大知识点,第一个是社区资源,第二个就是我们给大家实际编码。呃,这个讲了15节,说了15节啊是吧,后面就不给大家说了,大家关注一下就可以了,好吧。呃,我们来给大家讲一下实际的内容啊,就是我们本节课的一个核心内容,给大家编码实现。好。呃,我们回顾一下,在正式讲课之前吧,回顾一下上节课内容吧,上节课我们给大家讲了一个心跳的,不是心跳相当于我们定时给我们H5客户端发消息的一个实现啊,一个定时器的实现,也就是给大家讲一个讲一个事情,就是说我们服务器呢,如果常链接的话,是可以定时给我们客户端推送一些呃信息的,比如说我们现在有活动了,服务器有活动了可以啊,这边运营配好之后嘛,可以。
01:01
呃,通过命令触发一个事件,直接会把我们的数据推送给所有在线玩家,对吧。呃,这个推送的,呃,广播的消息嘛,相当于还是比较比较常用的,呃,它涉及到一个设计思路呢,就是我们要把我们的玩家的一个connect信息,就是网络连接信息要保存起来,保存到我们的一个内存里面去,或者保存到我们red里面去,这个是呃,必须是实时的,而且是实时保存的,也就是还有就是我们在后面做断线重连的时候呢,可能涉及到一个问题,就是我们那个在。呃,在他链接发生改变的时候,发从连协议过来的候呢,我们要把我们connect的一个网络信息呢,要重新更新一下,就update一下,然后确保我们保存在内存或red里面的用户的信息呢。是最新的。好,所以说在我们游戏服务器当中啊,这个心跳不是这个心跳的实现啊,包括我们一些呃,心跳饱和啊,在我们开发过程中呢,是一个重点。
02:05
呃,心跳直接和我们专业从联是联系在一起的,我们本节课呢,就给大家讲一下心跳,然后后面的话,我们呃,可能在16节或17节的时候在讲开,或者是在那个超时踢人的时候呢,可能会给大家讲到端线从联的一个消息啊,呃,其实所有的业务逻辑在我们14节之前啊,其实给大家所有的框架呢,给大家呃流程是跑通了的,就是在后面的时候呢,大家尽量呢保持一个。呃,怎么呢?就是自己可以发挥自己的一个呃一个idea的一个方法,就是你自己有自己想法的时候,你可以按照呃老师在前十前14季给大家讲的一思路,你可以去自己实现一下其他协议,对吧,你比如像玩家登录,咱们讲完了,那你可以玩给自己实现一个玩家注册嘛,可以吧,如果你对go语言,包括其他原有编程经验的话,你自己可以完成我们的后面的一些操作,比如说第呃第20节啊,第19节啊,像那个呃增加数据库啊,增加ras啊,你增加进去之后呢,你就可以让我们的H5客户端或者小程序客户端呢,就可以实现一个联通了。
03:08
但是这套框架呢,你是可以用的,但是性能方面呢,我跟你说是完全达不到我们上线要求的,也是说在我们第二期的时候会主动给大家优化这个框架,也至少20节的时,20节的课程,20节课程至少每节课程大概是呃,三十四十分钟左右吧,因为第一期比较简单,我没有录太长时间,大概在三三十分钟左右啊好,我们就进入今天本节课的内容,也是给大家讲下心跳,心跳呢我们首先呢,还是回到我们最开始,也就是说我们先要定义一个我们心跳的协议,大家觉得心跳协议我们还需要在接单在这里面吗?还需要在我们game data下面吗?心跳是属于我们什么功能,也就是给大家再说一下我们思维导图,那我们来看一下,再加一个。这样子。那就是。心跳的实现,心跳的实现,它的目的是什么?大家我给大家讲,大家回顾一下我们讲的一个主要的一个目的什么,第一个就是什么。
04:13
链接的一个这个饱和呢,我们就可以认为是加引号,它并不是网络连接那个宝盒。饱和,那么它呢,是我们链链接的一个饱和,也就是确认我们客户端是嗯是一直在线的,也就是他呃怎么是就是呃就相当于我们客户端呢,一直发新跳过来和我们服务器呢有一个交互,这样子呢,我们就不会在呃我们超时踢人的时候呢,给他做一个。啊,踢人的操作了对吧。如果你很长时间不发消息过来。那么我们怎么我们就认为你是断开连接了,那我们怎么直接把你踢掉了就可以了,对吧。
05:02
OK,那我们来这是心跳,还有一个就是我们的一个什么,刚才跟大家说可以实现一个断线重连。断云丛林。对吧,如果那个客户端这端层面是客户端主动发起的,比如呃,我这备注一下,大家可能会清晰一点啊,流程清晰一点,就是那个。客户端。突然主动连接过来。这个保这个还有一个就是我们体容一起玩嘛,超时踢人。超时替人实现,那么这个呢,是我们的一个什么超时替人,就是服务器的服务器的实现啊。服务器的一个事件。
06:02
还有一个就是我们的一个。链接的重置这个。这个在我们实际开发过程中会用到,这是极少的,极少大家知道有一个这个概念,有一个给大家讲保护咱们不然后给大家解释了,那么客户端专线重连呢,就是说我们客户端给服务给game server发消息的时候。发了十条,呃,我们是假如呃发了十条,那么每秒是一秒钟发一次的话,或两秒或一秒钟发两次,那我们就说简单一点吧,就一秒钟发一次,如果发了十次,服务器还没有回复我们心跳消息,那么我们客户端就要主动通电过去有再重新。另一个bookacket连接过来。连接过来,我给server里面的信息,因为这个时候已经确保服务器已经是连接不连接不到了,或者是我们服务器链接主动断开了,把你的contact信息已经关闭了,所以这个时候呢,我们客户端呢,要重新连断线重连一下这。断线重连之后呢。
07:01
当我们跟重新连接一个一个网络一个通道过来。嗯,大家理解了吧,还有一个超时替人,超时替人呢,同样的这个是服务器来做的,比你客户端我们心跳的时候,你还是那个意思啊,比如你我,呃,本来是十秒钟对吧,我检测10秒钟你发过来十次心跳。或者是八次寻秒有一个可能有一个误差,有一个极少的一个范围误差,只要你每秒重置的话,对吧,它有一个相当于一个计数,如果你在十秒钟内始终是没有心跳过来的话,也就是我们的计数始终为零的话。那么你就是认为你后端断开了服务器事件呢,就主动把这个信息清除掉就可以了,对吧,因为这个事件这个connect信息,玩家信息,连接信息的话,在我们服务器是没有用的了,理解了吧。这两个是两个不同的是,一个是客户端触发,一个是我们服务器触发,这个链接重置的话,就是在我们网络条件极差的情况下啊。
08:00
我们会在心跳的。协议里面心跳的实现函数里面会加一个链接重置,链接重置呢主要是保持一个。呃,保持一个我们相当于保持我们一个,呃,数据的一个链接信息呢,是最新的,就update那一块,这块极少,但是后面的话我会给大家讲一个极端,极端情况的话会遇到,好,那我们给大家正式开始。说这么多啊,来我们实际编码,那我们信息就不能放到这个里面了,所以我们在主协议里面要增加一个信息,增加什么一个网络信息,对吧。主协议我们要拆开了,这就可以。我不知道大家可以,呃,斌哥只是给你抛砖引玉啊,到时候怎么去实现,或者名字叫什么呢?你就还是按照自己的思路去实现,因为每个人的逻辑思维不同。对吧,可能我设计的时候本身就有缺陷,那么你就在自己是应用当中呢,可以改一下就改一下,嗯,这个这个都是可以的,这个都是。
09:02
没有问题的。游戏的网络信息。那么是三,那么这个换一下。好,我们的网络信息就在这里,那么我们它的实现呢,我们就可可以不放这里,我们再建一个文件也是可以的,那我们我们叫什么。名字尽量跟之前的保存一致就可以。怎么跟是吧,我们应该对。Night。这go。好,我们新建一个同样的原理,是一样的原理的话,我们还是用。后面是多数给大家编码了编码的过程了,所以大家要呃。实际我们要看一下,我们这样子就可以。嗯,这个也拿过来吧。
10:02
实际编码其实后面就比较简单了,后面整个来说就呃,就是你个人的逻辑思维啊,对吧,你的一个处理数据的一个方式。只能后面有一些像心跳啊,像开的使用啊,对吧,这些东西大家可能没接触过,就可能有点有点不不知道后面不知道怎么做,等当时我给你讲的时候,讲一遍你就清楚了,清楚之后呢,你就可以操作了,对吧。其实整个来说,呃,包括it行业没有那么难的东西,只不过说我们有些东西啊,要知道而已,对吧。好,这样子我们。我们可以用这个,我们换一下吧,就叫。心跳吗?
11:00
好,那这样子OK。诶,这个没付出来啊。他就一个协议就可以,其实就是心跳就可以。它结构呢,这个我们可以我看一下前面其实这个可以去掉,不叫CS,它其实就是一个。一个K的信息。可以这么理解为对。那么我们的结构呢?刚才点到哪里去了。水果体系ru。好,那么他呢,也是跟我们是一样的,也需要有一个我们的。主拈化的主协议和子协议。
12:02
这之前写了一个公用的啊,大家可以按照公用的写,也可以按照这种方式写,是一样的,只不过这样看的更明晰一点,明点,大家觉得我们这个心跳里边字段应该是什么样子,大家可以猜一猜,就是我们对整个心跳你有没有一个一个最初的一个概念,就是它应该是怎么样一个设计。大家有没有什么自己的一个想法?比如心跳起。有没有一个什么样的一个想法,大家觉得这应该是什么数据呢?大家呃,先可以想一下,其实在我们在我们整个那呃游戏发挥过程中啊,有一个玩家的数据在我们那个,在我们游戏服务器里面,或者在我们DBDB里面,在我们呃数据库里面是有一个唯一的ID的,对吧。所以呢,这个心跳呢,一定是能区分到是哪是哪个客户端,哪个用户发过来的。
13:03
大家猜这个,那这个这个字段怎么去设计。大家不可能发个心跳就发这个协议过来吧,那怎么那么去处理,我怎么知道哪个是玩,哪个是A玩家,哪个是B玩家,所以不值当是吧,所以说这个里面呢,要有个唯一的区分,那么在我们那个微信授权的时候,有个open ID,我们可以用I open ID来做这个。就玩家的。唯一ID来做。可不可以?Open ID就可以了啊,大家理解不?我们一定要区分哪是哪个用户,哪个手机,或者就是哪个手哪个用户登录,哪登录之后它是呃哪个用户发过来的,A用户B用户C用户,他每个open ID是不同的,所以我我不通通过不同的ID呢,我就区分来这样子。心跳型。
14:03
理解了吧,大家有没有什么,有没有什么还有疑问,你看我们只有整个心跳,还是PPT啊,心跳的过程。那我们把它逻辑实现,逻辑实现大家想忘没忘,我们其实呃,客户端服务器共用这个协议就可以了,共用这一个协议就可以。我们这个只不过服务器发回的是一个什么。你这个这个客户端可以不作为检查。如果server返回给。SOHO。Server server到clean。时候呢,这个客户端可以不去处理的,他只要确认是这个心跳协议就可以了,都可以不用管这个协议处。但是如果你做的好的话,客户端还要验证一下,多数是不需要验证的。因为你服务器一直在啊,对吧。不需要验证opd。
15:00
如果是serve返回给客户端的理解了吧,好,那我们逻辑实现的话,给大家说一下,逻辑实现就比较简单了呗,我们回顾我上节课讲的内容里面,也就是在我们。首先呢,我们主协议在哪里了?主协议在这里吧,那么主协议就得换一下呗,主协议我们加一条就可以了,在哪里?站在这里就可以了。我们把我们的主协议。网络协议拿过来。OK,心跳的协议对吧,这个是没问题的,那么我们来看一下我们的子协议呢,子协议是我们先稍微等一下,我们要实现一下我们的一个接口,也就是这个信息要实现一下,那么我们。其实整个来说就是我们就不应该写在这里面了。我看一下,在我们给大家总结的时候呢,就课程完了之后,总结的时候给大家拆分一下。就给大家一个完善的一个,那么这呢,我们就要实现一个类似于这样的结构,那我们复制一下啊。
16:03
我们增加一个吧,增加一个这样子好看一点。Night。CRT。要够。这样你加的话,你就可能有些诶加加没加上来。对吧,有些东西你要加进来所有的东西吧,我们这里就。这里就是net了。Z。要区分开嘛。所以说这边呢,我们就可以直接调用了,在这个下面。主协议嘛,对吧,我们还是类似。
17:00
因为斌哥比较熟悉了,有些东西大家也要看清楚,我自己要编码编码一下。大致就是这样子啊,嗯,我们把我们的整个这个全部复制过去。你看斌哥是比较熟悉的,所以说有些东西直接直接复制就可以了。那么这个主协议子协议呢,我们就换成我们刚才定义的子协议什么。是一样的嘛,对吧。让他。那么这个呢,我们就要心跳处理了,我们把函数的名字也改一下。大家晕没晕啊?斌哥这波操作有没有不懂的?不懂的一定要看一下我们的那个回回回顾也可以啊。哎。把它复制一下。好,那么这个呢,我们就用我们的心跳的写。是他的名字啊。
18:00
来。同样的,我们。我们把它拿过来。其实这样子我们我们整个就已经完成了,那么这样子呢,我们还要一个事情,也就是我们需要怎么主协议子协议来了,那么我们在这里面呢,需要我们看一下协议吧,大家不要晕了,那么协议呢,复制过来。在这边给大家说一下。这是我们心跳的协议,对吧?这是我们心跳的协议,那么我们这是应该有很多都不要的,这个T应该也会不要。我的也不会不要,好吧,先放这里吧,我们看一下。整个来说呢,我们心跳的话,大家知道了吧,我们心跳有逻辑的是这里。给大家写流程啊,做什么呢?解析呗,对吧。
19:00
第一步是什么?解析我们的。协议数据这个是没毛病的吧。解析之后呢,我们第二步是什么。通过。玩家的什么,玩家的唯一的一个什么ID去。保存是吗?保存。心跳数据。这是怎么搞的呢?我们肯定是map保存啊。这里面还有一个很大的数据在里面啊,大家要清楚啊,我是斌哥这边全部用map保存的。呃,这套架构呢,呃,在我们第十九十九节吧,后面应该很快到了,就给大家说一下,我们其实这样保存是不对的,大家应该会会到,如果你做压力试的一下就会。好,那么这样子呢。这里面呃,心跳,那这里面还有一个定时器timer。
20:02
Timer他是做什么的,大家猜?他是做什么的超市呗。大家就说这个是做什么。想一想。我假如是这个场景呢,是一秒钟。发育一次。秒钟除法语塞。出发一次没问题吧?理解了吧?那么这个timer做什么呢?就是我们后面要给他讲的超时踢人啊。这是我们在这个里面给你做的呀,大家看。对吧。专研同志还没有做,钻研同志先不说调研科学端的事情啊。同时踢人。理解了吧?嗯,那好,我们按照这个思路先解析一下,完第四步,还有第思路,我们发消息就不给大家说了。
21:03
好,这个协议我们关掉这个主函数,这个timer先放这里,不影响我们的。It不要,那么我们看一下。这个是。主要逻辑不要这个是之前的,OK,那我们就来看现在呗。解析解析的时候大家会了吧,解析的时候怎么解析了。这样子是吧,直接复制过一下,本身就是字符串类型的,那我们解析很简单了,它只不过换成我们什么,我们协议里面的数据大概是多少。这跟我们学习有很大关系了。这个没问题吧。这个解析大家还有什么问题没有,那我们前面要判断一下啊。其实判不判断对于我们来说,其实已经,因为我们马上要给他里面会做一个。诶。
22:03
等明天的时候我们直接翻了。其实不要不用写return也行,直接拍那就可以了,对吧拍那这里边呢,我们就是我们的什么心跳协议数据错误呗。错就可以了。对吧。这解析到了,那我们,那我还有第二步怎么通过玩家ID,那我们还要定义一个呗。对不对,还有大家定义一个什么,我们一个结构体信息,就是我们,呃,保存我们用户信息的,那这样子我们我们上节课那个结构体保存到哪里去了。你看一下啊。没有一个。I的源码。哦,在这里,那我们先别保存到这里边吧。那我们的结构体信息是什么?不是我卖部信息是什么,那我们就play是吗。
23:03
网络被叫也可以叫,那么它呢,后边是什么?后边就不是。大家猜后面是什么一个结构体也可以,你直接是int可不可以?直接是客户,直接是心跳的次数就可以啊,这个东西简单嘛,先给大家实现简单的对吧,简单的你都实现不了,你实现和对吧,你不会不会走呢,你就想跑,那怎么可以呢。这是不行的。OK,那我们来看一下我们的。来,OK,在这里。那我们把它保存呗。这里还要判断一下。先把它放这里啊,我们还要判断它的一个内容,就是它的长度啊。它长度呢,我这边来设计的话,是应该在65位的,也是65位的信息的话呢。
24:01
这必须是。等于65位长度等于65。然后等于65呢,我们把信息。我想想这个心跳,我们把它保存数据里面。保存一次。Do型的。那么他加加就可以了。好,这呢,我们在。二一下吧,二一下panic一下,我们把我们的信息直接。也是这样,也可以。
25:02
没问题,往这边呢,还要判断一下。这块是佳加佳加的信息,我想想佳佳信息如果在七人那边呢,其实那边如果对应该是这样,那我们加加信息就可以一直加加就可以了,但是我们判断一下。因为我们这个是什么,大家看到没,是我们是硬的型的。注意处理问题的时候大家想一想。我们这个数据呢,如果。我觉得这样处理不是很好啊。大一版的。但是大家知道什么意思吗?我们就防止它溢出啊,这个东西还是要做一下的。
26:03
喂,网址一出。OK,那么我们这加加之后呢,我们要返回我们什么,返回给我们的一个。Net信息就是要返回给我们。客户端啊,对吧。那么在这里面呢,我们就要加一个在这里面作为返回。那么主协议,子协议呢和结构呢,就是用我们的。点net里面的信息。主协议呢,我们就也换一下主协议。这是子协议,换一下主协议呢,是我们的。心跳了。网络结构心跳OK,那么它的结构的信息呢?结构信息是我们的。这个结构信息没问题吧,OK。
27:00
那好,他下面呢,就是open ID了,Open ID我们可以不回,我们还是回吧,回的话可能,嗯,他那边如果客户端如果验证的话。对吧,或者他还有其他操作的话,可能我们还是要回忆一下的。OK,整个流程就给大家。写完了。对吧,这个心跳的一个一个操作完,这超时替人呢,我们是下节课给大家讲啊,结合我们心跳给大家结合超,呃呃,做一下超时替人,本节课呢,就不给大家联调了,我们下节课做超时替人的时候,一起给大家联调一下,嗯。好,那我们回顾一下本节课的内容啊,本节课内容就给大家讲了一下我们心跳的一些机制和心跳的一个实验方法,这个心跳实现逻辑呢,比较简单啊,就是按照我们正常逻辑走走就可以,只是大家是大家熟悉我们心跳的一些作用是做什么的。那四点啊。可能还有其他的,但是在我们游戏服务器上呢,主要用的是这个比较多一点的。
28:00
可能还有我们呃内服务之间server,因为我们现在给大家讲了之后一个game server,包括我们那个网关服务器,跟大家讲网关服务器先不急,我们先把框架实践完了,因为大家有一个入门的一个思路啊。后面做的话就好做了,对吧。而且大家说一下,我们现在呃,就给大家说,昨天给大家讲了一个事情,就是我们现在造这个房子,现在基础框架已经呃慢慢搭建了,但只要是框架,比如只有支点啊什么,还没有,屋顶上可能刚刚建起来啊。像那个屋顶的什么瓦片呢,还没有,还没有给大家加上啊,只是说有一个架子,架子还没搭完而已。因为。因为有些东西啊,比如说像我们给大家说这个这个信息是这么处理是绝对不对的。绝对是不对的,为什么呢?因为我们在在我们逻辑处里面,逻辑处理里面是。高并发来执行的,那你像这种如果用户多的话,十几个,我就我觉得就会有问题了,好吧。
29:01
先不说,大家可以去自己跑一下,看一下具体实现会不会像斌哥说一样有问题啊,有问题你自己能不能解决,我后面我会给大家讲的这65位呢,我到时候给大家为什么这么设计啊,这都是有有依据的。好,那我们今天就到这里吧,我们下一课给大家讲一下,我们超市替人结合今天的联调一下孙便好,那我们下一课再见。
我来说两句