00:01
到自觉教育课程的学习。本系列课程呢是自觉教育的第一季,从零开始搭建游戏服务器。本节课呢,是第五节。游戏逻辑层的数据处理实现。本节课呢,两大知识点,第一个就是我们公共平台的资源,第二就是由于服务器如何处理客户端的数据,也就是我们的一个核心的内容,本节课的好看一下第一点。呃,这是我们社区的公众平台啊,订阅号大家可以关注一下,现在有几万人关注了,关注之后大家有个小福利啊,大家可以回复关键字客服呢,获取我们助教信息的,助教信息的一个微信啊,大概加一下。好之后呢,会微信我们助教呢,会把你拉到我们微信群里面。微信群呢,主要是给大家推送一个消息啊,就是我们目前更新了哪些课程。还有呃,大家如果有意见和建议的话,可以给我们助教反馈。我们来给大家讲我们本节课的核心内容,就是服务器如何处理客户端数据信息啊。
01:00
我们上节课呢。呃,给大家回顾一下我们上节课的内容,上节课的内容呢,我们给大家讲了一下,我们。消息的定义也就是。我们自定义消息怎么实现的?嗯,消息在这里啊,是定一个主函数主协议啊,主协议规则。其实大家可以简单理解一下,就是消息就是制定一个规则,就是允许和我们客户端达成一致的一个规则,这样呢,我们客户端发过来的消息,我们服务器可以处理,同时呢,我们服务器返回给客户端的消息呢,客户端也会处理。因为我们现在是以杰森的形式啊,杰森形式发给发给我们客户端的,因为这样对于我们微信小游戏啊,我们H5小游戏啊来说呢,呃,处理比较方便一点。我们就没有采用。还有一点在这里给大家说一下,像其他的开源框架呢,可能会选择一个RPC的一个方式,或者一个消息注册的一个机制来给大家注,来给大家实现的,比如说这个注册消息嘛,他是杰森形式的,他就定义一个杰森之后,比如这个结构体,他就以这个结构体来去注册。如果这个。
02:06
这个结构体如果你注册之后呢,就会存在我们一个结构里面去。玩家进来的时候呢,发消息先是通过我们名称去找,通过反射,通过员的反射去找我们结构体在不在我们那个注册结构里,如果没有会反应注册。其实这种方式呢,后。在性能上呢,是没有我们处理这么样处理性能高一点的,首先呢,我们这么处理的话,只是逻辑层在做一些处理,而没有涉及到反射,因为各个源中如果大量使用反射的话,会影响严重影响性能,因为它涉及到一个呃,内存的一个分配和GC的一个处理啊,所以我建议大家呢,呃,在。嗯。开发架构的时候呢,有些性能的话是可以优化掉的,本身呢,给大家说一下我这套架构呢,兵哥这套架构呢,是来自于呃,C加加的一套金山的一套一套架构啊是我照着那套架构,嗯,相当于。用go语言来实现了一遍。
03:01
好,那我们来继续开始啊,给大家说一下呃,我们今天的内容,今天内容就是给大家上节课,在最后呢,给大家说的一个就是消息处理。处理子只协议这一块。那我们给大家画一个流程图吧,还是画一个图,先跟大家说一下。首先呢,消息处理涉及到什么东西啊。帮处理。那么第一个就是说网络层。网络上的一个。网络层,这涉及到什么呢?我们给大家说一下。第一个就是我们。慢函数,一个监听接口。监听。端口。大家知道我们,呃,有没有同学不了解那个socket的这个概念的,有没有不理解这个网络的。它soccer代表什么东西?有没有不知道的?一个烧的一个接口。
04:01
暴露给外面的就是。爆了给。公网的吧。公网的。端口和IP地址。啊,这一个socket其实就是一个端口加一个IP地址,也就相当于按按正常那个简化来说呢,Socket就相当于我们。呃,理解为我们现实当中的一个门牌号,就是你家住的地址就可以了。或者是我们一个单位的一个地址,可能有点小大一点。这样子。好,这个接听端口它涉及到一个我们的,比如我们现在给大家接听端口是多少,大家记得不?我们看一下主焊双明明是四个八,那我们啊。我们监听端口就是。这些这些数据呢,大家一定要知道一个怎么去处理的啊。
05:02
OK监听端口。这是。那我们的IP地址呢,我们的IP地址呢,后面我们再放到公网上之后呢,我们再给大家说。因为涉及到一个部署的情况,我们本地的话呢,其实就是本地的话就是什么,包括house或者是用我们的IP地址。幺二七点零点零点。0.1。冒号就可以了。只是我们监听了一个端口,本地的。这是我们监听端口,这是流程啊,这是我们监听之后呢,也就起起一个server出来的时候呢,我们必须满足这个条件,同时呢,网络层这里面就会有一个我们是web socket的时候。我Su。这块呢,我们就会。对应的去做什么呢?首先呢判断一下。判断是不是。我们符合我们的一个协议,这是网络层判断的,是不是我的,如果不是的话,我们这块怎么判断就相当于。这是一个,如果不是呢。
06:00
如果不是,那我们操作呢,就直接。直接会返回,报错直接会。返回。网络层。网络层数据网络层。网络层数据。给客户端。如果是呢,我们就是进行处理,Yes,死之后呢,我们就处理。处理呢,这块又分为另外一种情况,也就是说我们我们处理的话都会处理吗?大家觉得。大家都会处理吗?还不时把球。符合。我们怎么。规则的。处理。不符合规则呢。那怎么办,就。不符合。规则的呢,就。就是直接的吗?错误码,这是我们的错码,会给大家定义的。
07:01
好OK,那这样子一个处理,那么还有一个判断,是不是weck是。是来处理的,那么这呢,其实就没有了。如果不撒开,这是三个数据啊。虚拟化。其实。去的话在这儿写也是可以的,包括啊。款。数据化,数据化操作。这个呢,就是。嗯,判断是不是我上害的,如果这是虚拟化操作,那么这还有一个什么。应该网络层不这块就没有了,那这块就把它去掉去。因为我目前就暂时要这个OK。你这是网络层。好,那么符合我们规则呢,也就是在这里面呢,那我们怎么办呢。我们其实就是往下走,也就是我们今天给大家讲的一个。也就是符合规则。那么我们就。获取数据。
08:02
判断。主协议。主协议用到了吧,主协议之后判断之后,主协议之后怎么办呢。如果是的话。如果我们。有的话,也就是说像我们。呃,其他框架一样,你注册了,那么我们就怎么,如果没有,那我们就返回错误吗。返回错误码,如果有呢,我们就处理。处理呢,这会儿怎么去处理呢。到这下面来啊。他是一集一集的。No呢,还是一样,那么没有呢,就是。等一下啊,处理处理什么呢,这块处理。子协议。同样没有呢,我们就返回错误马。
09:01
然后做码,如果有呢,我们就处理。处理功能相当于处理功能呢,我们这块呢,就是做了一个。这同样的。如果是。数据错呢,解析的时候数据错了,数据错误呢也会。我正常的呢,我们这里面就是。正常处理。重伤。好,那我们先看一下整整体啊,嗯。从前面这来网络层这一块,这块我们已经做完了是吧,那我们看一下就we socket,今天给大家讲,如果是we socket,那我们就往上执行,我们只是说的试的就可以了,如果符合我们规则,不符合我们规则,我们就返回错误码,这是底层,因为你不是卧铺,会直接返回的,如果符合规则呢,我们会判断是不是主协议。块的,或者这块有一个。这块我们后面还有也是ttp的一个协议。还有其他的吗?TCP。
10:00
T,先不管,先说那么多。判断一个主协议对吧,判断主协议如果存在的话。我们就会,如果不存在呢,我们返回错嘛,就是主协议不存在,如果主协议存在,我们会继续判断此协议,此协议存在呢,我们会处理功能,功能的话,如果数据错了,你发的数据错了,我返回错误嘛,同样如果正常的,我们就处理正常的处理逻辑,大家看到这个整个逻辑没有。这个大家可以先不管,把它删掉,误导大家。这整个一个流程下来。理解了吧?有没有这个小伙伴一定要把这个流程图看一下,比如我们网络层做了什么事情?我不进来,一步步处理。到最后呢,这块是相当于我正常落地处理了。先判断是不是web socket,是web socket,我们判断主协议,主协议就是我们给大家。上节课给大家定义的这个主协议是不是在我这里面,如果你发了三过来,那我肯定不存在啊。我会反问你的错误嘛,对吧,同样你发子协议发五以上过来567,那肯定我也不会处理对吧。
11:03
大家理解了吧?这块会直接返回错误码,错误码的话我们会直接给大家,会给大家定义后面再逻辑处理的情况。好,那我们就给大家说,呃,说一下我们今天的主题了,今天主题就是我们怎么了。我们做什么大家能能猜到,能不能猜到我们给大家做什么呢?我们上节课定义的主协议子协议是吧,那那这一步还没实现的话,就socket这一块进来怎么去。我们这块还没处理,只是上节课。呃,第一前几节课把这个处理了,把主协议定义了,对吧,那我们下这一课主要是给大家看一下我们怎么实现op Su的一些数据的解析,然最后到达我们主协一则协议,好。那我们来给大家正式。首先呢,回到我们的。嗯,这个下面来,也就是我们的一个。一个相当于我们处理一个结构下面的。
12:00
这个结构呢?暂时就先这样子,我看。呃,现在在处理之前呢,我们首先给大家说一下,我们必须把我们的网络结构呢,先定义一下,也就是说最后呢,我们先现在所要做的事情呢。第一个事情就是说我们先把我们的网络结构存储起来。这样子我们需要定义一个结构,定义结构呢,我是定义在看一下。同样,我新疆的门将。这个呢,我们就叫一个什么。的一个。Net一个什么?一个什么呢,我想想。一个网络结构,那么网络存储结构。网络。数据学科。这就可以。那么我们这个呢,这个建立好了,那么它的package大家也知道吧,那么肯定是也是函数,因为它在同一录像,那么这个里面呢,我们就定一个结构了,这个结构呢。
13:08
后面呢,我们就跟我们一个什么样的数据呢,我看一下,那这边呢,我们就要定义我们网络结构,我们网络结构定义名字呢叫什么。叫night。可不可以起个名字?这个名字大家可以随便取,但是斌哥就定义它了,这个是做什么呢?也就是哎。这个是做什么的呢?也就是我们大家备注一下就是。就是web的网络结构处理,也就是web so,也就是这一步啊。有时大家看流程图在这部是Bob的是吧,到这块怎么处理呢?其实这块还有一个网络的一个。网络的。结构的保存。
14:01
好,我们现在实现这一步啊。那我们来继续。好,那么它的结构里面有什么,大家猜,因为呃,这没有我。网络数据。保存对吧。网络,一个数据结构的保存,那么它包括什么信息呢?就是第一点就是有一个。OB的一个网络链接。还有什么?答案是,其他的还有没有?还有没有其他的东西,大家觉得。感觉上会不会有其他的一些。那我们先定义一个吧,先不给大家说是定义什么意思啊,ST。MD5的一个,这呢,相当于是。房间的。加密信息。这儿呢,我们后面会用到。
15:01
给大家抛砖引玉嘛,好吧,那我定义两个结构,那么第一个呢,我们就叫连接信息,那么大小啊,大家记得。小写。在我们。对不起,没有错C。那么现在呢,我们就要。吗?用我们的web socket底层库的一些就是链接信息了,Web socket呢就是web song。不,Suck。Second下面有一个。K的信息啊。好,我们再来看一下,我们先导入我们的,导入我们的import第三方包,第三方包的话呢,大家也我们复制过来就可以了,再。啊,这个结构我们还定一个什么str的一个M,第五的一个数据。
16:03
字符串类型的就可以。这来备注一下,这个就是我们第一个网络数据连接信息,好吧,这是我们的一个结构信息,理解了吧,先暂时这样子定义,这是我们保存数据网络结构,也就是在我们结构在我们流程图这里面的。好,那我们来继续啊。那么我们在网络层在这里怎么去处理呢?大家觉得我们去怎么处理好?这里涉及到一个。TP。你定义个临时变量,它那休息功能与我们定。一个。这样呢,我们需要初始化了,初始化什么,初始化的我们一个结构信息,那么这个里面就涉及到我们刚才的结构了,这个结构呢,就是我们connect。Connect信息呢,就是需要第一个。它呢,它结构体会初始化不。没有,不是不会初始化的。WS就可以。MD5呢?MD5,我们随便控制。
17:00
写一个控制信息就可以了。M第五的话,我们随便一个字串就可以了。这我们先不管他。这样我们要这个信息是做什么呢?大家猜。我们是做什么?有没有小伙伴知道的?就是就是网络信息。网络信息。网络信息操作。大家知道我们做什么,其实我们就是在想这里面呢,因为我们在在过源当中呢,有些数据的接口我不知道,大家知道接口的概念吧。就是比如说我们就I什么一提啊。这样你定义接口,你会定义接口里面是方法model方法是吧,比如你ADD啊。布尔类型的对吧。这种类型。对吧,你这么定义可以,它代表一个接口形式,接口是不实现的,这是接口。
18:05
接口呢,是只是给规则啊,就是你不用解等。他那是不实现里边的方法的。不行里面的。它只是定义一个规则出来,也就是说你继承接口之后呢,我们会需要这样子的一个操作,比如说我们这样。今天给大家讲呢,也给大家讲一点吧,就是说我们定一函数吧,给大家说一下接口的话,我这带一笔啊。一。用了,但是我们在我们实际当中是不这么用的,比如弟弟等于什么。I12就可以,那么这呢。我们课一个结构啊,就是。D冒号等于什么呢?我们可以定义,哎,同样吧。那也行吧。就是这样子,我们可以定义这个结构啊。
19:02
VR也可以,VR。它这个结构,但是这个时候呢,我们就可以让我们的一个函数。一个函数等于。等于D。对吧。这样就可以,诶等于RS,那么这样操作就可以了。这样呢,我们必须也就是我们这个自必须实现这个接口,要不然的话会报错,大家会复习一下interface的一个相关知识啊,我在这不给大家讲了,但是我在在我们整个架构当中呢,就不涉及到尽量不用接口的概念,因为它涉及到反射,我就并规避了这个。呃,这个性能消耗的地方,所以说这块呢,我就给大家屏蔽了一下,后面我大家再具体讲我们第二期第三期的时候再说一下为什么或者说得从底层我们来做一个区分,做一个这个性能的一个测试,包括我们把接口都换,都用接口来实现,或者怎么样,好吧。我们来继续啊。
20:01
啊,这一块呢,我们就需要一个。什么呢?其实很简单,其实我是想给大家抛出来一个东西,就是它。知道是什么意思吗?比如说我们必须有一个方法成员函数在这里面去实现。对吧,大家理解没。呃,结构体的成员函数怎么去实现,或者他方结构体的方法怎么实现?大家还有印象没?Have c后面呢,我们加什么?DGI,然后加上我们的一个结构体的名字,对吧?啊,结构体的名字在这里。结构体的名字,那么我们叫什么呢?这个其实我们就是第一层网络处理,那我们就。什么?From。CT可不可以?这样子我们实现的函数是什么?我们返回一个空的就可以了。这是没问题的吧,那么它的处理呢,就是我们。就是我们结构体的方法。
21:03
结构体。方方法接收者是什么指针吧?接收。接收者是什么?是是真?只是类型的。好,那我们只是接收者,是指认类型的,那么这样子呢,我们就可以这样处理了。我们不加任何参数,诶等一。这个呢,相当于我们从客户端怎么正式创造一个实例过来。好,我们这是一个相当于我们从客户端什么来处理一个消息,就相当于客户端消息。指针。指针接收者。消息。大家看到我们流程图啊,就是在这一步了,我们现在来等下给大家执行好,我们回到我们的一个函数里面来。
22:05
这样子吧,我们先编译一下,编译一下看能不能过,看有有没有什么问题啊解决一下。OK,没什么问题,那好我们来继续啊,呃,继续的话呢,我们在这里面呢,其实就要做一个处理了,这会儿呢给大家。这个这个结构里面,大家猜一下处理什么,我们看流程图啊。选到这儿。在处理东西了,也就是说我们从网络的结构进来,大家觉得这一块我们应该处理什么,怎么去处理呢?有没有一个想法?有没有一个想法?大家觉得这个我们编码怎么实现?那我们这怎么实现,大家知道我们网络网络编程当中接收消息是怎么实现的吗?就是三主机的时候receive大家怎么处理,Receive是不是一个死循环来处理的,就是我一直在这接受,一直在循环接收啊,对于服务器而言。
23:02
嗯,大家如果没有网络编程基础的话呢。这块呢,我看一下。建议大家去学我们那个基础课程吧,去看一下我们那个我socket的一些编程,编程基础在那块,可能大家可能学到一些网络编程的知识啊,因为如果你没有网络编程的知识的话,你在这块处理的话就比较。比较难弄了,对吧。或者我下节课讲,下节课讲的时候给大家说一下吧,那就。这现在说也可以吧,其实就是这样子啊。就是网络层的。网络层处理呢?处理数据呢,在对服务器,针对于服务器而言啊,针对这一个。等一会儿啊。针对服务器而言呢,对吧,它是要一直。一直等待消息的,那么这个等待是怎么处理的呢?等待的处理方式呢,就是通过循环、死循环,一个循环来处理的。
24:06
比如说我们。啊,我看看能不能给大家举一个例子啊。好,大家把这句话先了解一下,那我们先把这节课讲完,我到时候下节课给你们大家补一下吧,或者。属于知识拓展,给大家再说一下。我不CK,那么我们来继续吧,其实就是,呃,按照我们刚才的思路,就是一个死循环嘛,那我们直接放就可以了,我们在这里面做什么呢?这里面做什么。大家。我们其实一直等待,也就是接收我们的一个消息,对不对。接收我们消息的里面接收消息大家,呃,可能有没有上上节课。呃,看完我们的课程之后去复习web相关的知识的。它本身呢?诶等一会它本身呢,有一个有个方法,Msg message完了之后呢,下面是我们receive reive应该是reve。
25:05
后边呢,其实是什么呢?就是我们链接的一个信息了,也就是我们类似。你必须从网络层接收嘛。大家是。没有。应该是。第一个是网络链接信息,第二个呢,它是我们的一个。结构,这个结构呢,我们首先定义一下每一个,这个是VR的,那么我们定义什么呢?哦,随便定个几个,就那我们就。我们定义那就可以了。那么它是什么?它是个类型。Str。尺寸类型的,那好,我们在content里面直接把它复制就可以了,OK。OK,这是我们接收消息,接收消息的时候呢,但是我们会,嗯,知道它是我没有网络报错是吧,它有个返回值叫error e,我们直接。
26:02
等于它就可以。如果这儿呢,就给大家说一下,那我们判断一下呗。大家知道够也可以这么写吧,If可以写一个。这样的一个层次,这样子呢。这个判断有没有网络错误?如果网络错误,大家觉得我们会怎么办?大家猜我们怎么?Return break。就进入下一循环呗。Break就可以。好,那我们还有一个就是我们接收到信息,如果这个,诶这儿不对,这应该也是点。是socket一直等待,我们一直循环,一直去从这个里面去。去循环我们的消息。那么这样子如果它有网络错误,能不进行下一循环,好,那么这样子还有一个问题,就是我们在接收网络消息的时候,Connect如果为零的话,大家就怎么我们也会不会处理,那其实也不会处理,对吧?所以这块呢,给大家优化一下,就是说。我们网络接收的消息的长度为空的话为零。
27:00
因为本身没有意义啊,零本身就我们不。才是不。这是两种比较常见的情况。之后呢,我们其实接收到之后呢,我们在这里面就。这里面大家做做什么处理?这不正常处理。正常。大家好。理解不和我们正常处理。这样子我们。应个消息。这样子我们打印出来吧,我们把这个消息fmt。包含进来。我们。LN,那么我们打印什么content出来?我们把我们的数据打出来。OK,那我们就给大家演示一下吧。好吧,这是我们网络层的处理。
28:07
那我们来给大家编一下。看有没有问题。嗯,他这有一个什么啊,多个S这个这个。诶,哦,错了这个。大家慢慢来,跟着我写代,跟着我敲代码,一定要。你不跟我敲的话,我觉得你没啥意义就可以,对吧,你一点点能看懂,能看懂是一回事,你能敲出来是另一回事,对吧,敲一边的话。我代码是补给大家的。对吧,前期不会打架的OK。这是什么情况?哦,我们这个是it里面的。我们不要了,这个整个就。
29:06
这是干扰我们说。干扰我们钓一下就可以了。编一下呗,看一下我们主函数没有问题啊,先排查一下没问题应该。这就对了,四号。那么我们用我们的来实验一下,给大家展示一下。B就我们测试的一个。也是我们在那个课件中给大家说的一个工具啊。And build本来用过乱的,过乱的我可以这个都可以,后面的话看吧。国家的提示比较好,但比较傻瓜,感觉看不到一个过程。Data ID本身也可以感觉。好吧,就是这个。这个就可以呗。那我们date里面是不是存点东西出来?
30:09
这都会传传数据过来,我们给大家看一下。这边开发边看。边改边看啊。已经连上了,那我们这块应该有数据了呀。然后这大家可有数据了,已经。钩浪社区欢迎,应该在HTTP这里打印的。我让社区欢迎你date呢?对的是空,那好我们发一个。现在这个这对空是对的吧。呃,其实这还有个判断,如果为空的话,我们会返回,那么这样子。我们来。返回了一个BASE64的。我们看一下来看一下这啊有处理了吧。大家看到消息没?
31:00
这块已经接收到了,接收到的就是我们在这个函数里面。产生在哪?这里面打印的。打印出我们可能还有信息,打印信息呢,看到没有,是一个杰森的一个。并不是一定不用它一个字符串啊,用自身类型的,它并不是杰森的,我们在哪发呢?给大家看一下。是在这个地方发的12SA,看是不是我们RC。大家知道了吧。哦,这块正常梳理,整个呢,我们先看流程啊,先看流程是我们处理到这里。一二。这两步我们实现。大家看到没有?大家把这个代码自己研究一下。研究一下就可以了,我们这节课呢,其实就差不多,下节课我们给大家讲一下,我们处理函数,也就下节课呢,我们给大家在这里。给大家讲一下构语言最核心的东西。并发编程动作。并发编程的使用了,大家可以先复复习一下。
32:02
这已经没什么问题了,OK。回顾不用回顾了,很简单啊大家呃,记住啊,大家一定按照我的思路,大家去敲一下代码,完了之后不懂的呢,可以去我们群里问,微信群啊,QQ群可以问,或者呢。呃,或者大家呢,自己网络查一下,有不懂的再问斌哥就可以了,呃,比较简单,大家首先呢,需要一个过程啊,不管你是学什么,你必须有一个呃认知的一个过程,要不然的话你直接会了,那我觉得你是神童啊,那你就不用来听了,那你直接叫兵哥就可以了,对不对。我们本节课就到这里,我们下节课再见。
我来说两句