00:00
那刚才呢,我们已然哈,已然完成到这个,呃,离我们这个功能呢,还差一点点,因为我们现在已经完成到哪一步了,相当于哈,就说服务器端接收到消息了,并且呢,反序反序列化成对应的消息结构体了,这个是没问题的。然后呢,服务器根据反序列化得到消息,判断是否是否登录用户合法,并返回log log in response message,没有做,没有做,那这一步呢,又涉及到一个问题,什么问题呢?你得想你这个服务器端能够去处理登录的这个消息,那就意味着将来服务器端还会处理各种其他消息。所以说这个地方呢,你还得想办法做一个结构。也就是说你不能说我只处理登录的,其他消息我不处理了,所以说这个时候呢,我的这个思路要来了,我会在哪里呢?各位同学,你看目前我们这个很傻。
01:02
来了过后,我们直接开了一个携程去做事,但是你想没想过将来这个携程他也可能去处理很多事儿,所以这地方应该还有一种分支,就说他在根据他实际情况呢,它应该有个根据不同的情况去调用不同的这个函数的一个事情,就在这里面呢,它应该有一个有一个类似于这样一个东西,各位同学。好,各位同学,那也就是说这个地方针对这个斜程这个地方咱们是不是要考虑一下,根据它的不同的请求,就是根据处就是这样处理。处理不同的消息。不同消息,那也就是说在这个携程里边呢,我们应该有这个有一种功能,或者有一种函数机制能够让他去。调用不同东西,我的思路这样子的啊,在这里我们让他去调一个自己写的函数。
02:03
听我说,那相对说你把这个message填好过后呢,我把这个message,我让它去调用一个函数。这个函数呢?这个函数的名字我姑且。把他叫住。我把它把这个函数的名字我叫做什么呢?Server。Process message。Servant。Process message。Mes。那这里面呢,一个填东西在这里面呢,我有一个判断,就是根据你的消息种类不同。根据你的消息种类不同,我调用不同的函数。因为你想嘛,你不可能。你不可能处理所有消息都是一种一种业务逻辑,登录有登录的业务逻辑。对不对?注册有注册的业务逻辑,你怎么可能把所有的处理都放在一个函数里面呢?必然这个地方会有各种函数。
03:03
那将来这些函数你又得想用什么东西把它管理起来,比如说吧。比如说这里我们有管理这个登录的一个函数,就是处理登录的。处理这个登录的。对吧,那将来呢,肯定有处理这个注册的。处理注册的。那有可能还会去处理发消息的,还可能处理离线留言的,还可能处理这个这个这个比如说群群发消息的等等,那你这个地方肯定有不同的函数,所以说呢,这个我们先把这个登录处理这个写个函数,比如说该待会呢,我写的这个函数我估计叫做server。Server process。什么玩意儿呢,这个log。好,那大大致的意思,大家看到我要在这里面添加两个函数,一个是server process message,一个是server process,因为在这里面呢,我会根据它不同的情况调用不同的函数来处理。
04:10
就是我根据你不同的这个消息包。我根据你不同的消息包来调用不同的函数,最后你把这个结果给我,然后携程根据不同的结果,然后打回给这个客户端,它是这么一个逻辑啊,很正常啊,这种这种这种逻辑是很正常的一种逻辑,那么你看老师写完代码过后呢,你会觉得诶这样的思路应该更清晰更好一点。因为我们做编程,尤其是程序的结构,它有一个核心的观点,优化效率一般用缓存来解决,优化我们程序结构一般用分层模式来解决,这是一个非常重要的两个核心的一个观点,你不管怎么样都跑不了这两个观点,你要优化速度,一定是缓存来解决,加算法。你要去分析,你要优化你程序的结构,一定是分层,你MVCMVC也好,还是什么模式也好,Model模式,它的根本的核心思想就是说各司其职,这一层做什么事,这一层做什么事情,把它分散下去,就好像我们这个国家一样,你看这个咱们班级要管理好一个这个习总书记这么这这这能力很强吧。
05:16
13亿人口,让他一个人直接管,他管得了吗?你看人家很聪明,管几个部长就行,对不对?我管20多个省长,省长管,市长市长管,县长县长管。镇长镇长管村长,村长管组长,组长管家长,最后管到你身上了,那不是就是一个分分成的模式吗?最后哎,你看习总书记。把20几个省长关起来,把部长关起来,这个国家就治理很好。对不对,你包括以后这个做服务器集群,它也是分级模式,对吧,我一个总的服务器下面挂几个服务器,服务器下面又在分级,都是一种思想,这种思想在任何地方都会适用的,以后你学到这个关键点,你就发现,诶其实程序也不是很难。他都是这种思想啊,来,不说废话,我们写代码。
06:03
哦,我反复在强调这个思路的问题,好,那么我们刚才呢,已然写到这儿了。我们现在呢,就在这个基础上来处理他的这个逻辑,好,最后把这个包给他打回去啊。好了,朋友们跟上老师思路,那首先呢,根据刚才我们这个观点,我先去写一个server process message。好的。那我找到我的服务器端。我找到我的服务器端,我们是chart room里面的这个,呃,这个命现在我都想写在一个文件里面的啊,后面还要拆。好,现在是开始。编写,编写一个server。Process。呃,处理什么呢,Message。这个函数目的,这个函数的功能是什么呢?这个函数的功能各位,这个函数的功能是就是根据根据这个消息就是客户端,客户端发送的,发送的消息种类不同。
07:14
种类不同,决定决定调用,调用哪个函数来处理,就这么111个事儿。因为你不可能把所有东西写成一个,写成里面去不现实,所以说我就开始写东西了啊,这个函数呢,还是比较简单的,叫做server。Process mes,那你既然要处理这个东西,你首先得把连接给我,因为你不给我连接,我我自己都搞不定,所以说seven。net.cn。好seven,然后呢,你还得给我把这个message给我,你不是在这已经拿到这个message了吗?你就不要逆袭了,给我吧,你给我我我有用,所以说这个地方呢,咱们拿到他已经得到这个message,像这个message呢,我们用指针比较合理。
08:07
好,最后呢,你如果产生一个错误,你把A给我给你返回去,好,总体思想就完了,那这地方我们怎么来根据不同的消息类型调用不同的函数呢?非常简单,我们用过这个思维,取一句,这个时候用Switch值比较好,因为你的消息种类再多。最最多可能也就十个20种20种吧,十种20种,其实这个有点类似于我们在写什么呀,有点类于我们在写别的框架的一个总控,有点像他在写这个控制器这种感觉。啊,有点像这个东西,那么我们就可以做一个Switch,首先这个message来Switch。就是根据类型来处理啊s Switch Switch Switch哪个呢?就是mes,点它这里面不是有个type吗?诶这个type就有用了。这个type现在就就充分发动,发挥它的威力了,那么我们来kiss一下,如果它的这个类型等于message.logging。
09:10
Logging,这个message type OK,那因为我们前面已经定义了这个常量,就说它如果是等于这个这个登录的好,那么我们就去调用刚才老师写的这个处理登录的这个函数,当然如果你是要我注册的这个好,我就去调注册的业务逻辑,你看这个就相当于自己在写一个小型的一个框架,那种感觉对不对,好那么这个地方就是处理什么呢?诶,OK,这是处理登录的逻辑,处理这个登录逻辑。那么如果说啊,Case。如果说他是message。点什么呢?捞假设是,嗯,这个好像没别的啊,现在我好像就这一个,给我发一个就就这一个啊,目前好像就这一个啊,好像就这一个,那先不写了,那我就写一个别的,我好好像还有一个别的case message。
10:07
点log,如果他是response用上,因为是我是给他的,给他的这个都用上啊,我们可以将来写个别的类型啊,比如说我我稍微扩扩展一下,比如将来呢,我们有一个呃,登注注册的这么一个逻辑啊,假设有个注册的这么一个东西,我写进去type,比如说将来有一个呃,注册的register。所所以G这个message吧,好,我先简单写到这里啊同学们,十个亿,那你注册的时候肯定要有相应的信息了,你注册可能给我带一些什么什么密码呀,什么这个对不对,好那么我先把它定在这里,十个亿好吧。好十个亿,就比如说他有个register type。那么这个时候呢,我们给他一个类型。是什么呢?就是这个message就写个type啊,写个type,就假设这有一次是要他想去注册,那这个地方呢,我们也可以把它写到这里来。
11:12
在哪里呢?诶在这个地方啊,Message。点这个逻,这个逻辑好,那么这边就是处理处理这个注册的。那调用的是另外一个函数,那如果说其他假设啊,他说的是我找不到的at,我们就给他提示一个信息,就说你的这个你这个消息类型不存在,无法处理。好,我们写一下,就是消息类型不存在,消息类型不存在无法处理对不对,无法处理,无法处理就无法处理算了。啊,最后这个就完事,那么现在呢,这个写完过后,我们现在关键就是要写这个处理登录的啊,你看我这边代码呢,大体也是这个逻辑,看到没有啊,这边有个error,我们要接收一下啊,最后有个error,最后这个一个。
12:01
因为你你最终这个处理登录,还有处理这个注册呢,一定会给我返回一个错误信息,因为我这有吗?好,那你要给我写好开始写代码。开始写啊,那就是编写。编写一个函数,这个函数呢,我们就叫server process logging,这个函数干什么呢,专门处理。专门处理登录的这个信息,登录的这个请求。登录的请求。好,那现在呢,我们就写它,那就server什么呢?处理logging,好,那你除以log的时候呢,你一定也要把这个东西给我传过来,对不对,你给我这个东西我才能处理,因为你要给我链接,我才能发东西,你给我这个消息,我才知道你消息是什么,然后呢,最后呢,我这也应该有个L。好差不多了啊,大家不着急,那代码呢,就要就要这样一点分析出来。
13:02
好了,现在那你这其实就调一个这个东西怎么调呢?你调它把这个connect传给我,然后呢,把这个message也传给我,最后我给你返回一个error,这个error呢,应该是个命名的,说这个地方处理完了过后,最后return就是它。就基本思路就完了,这里面是我们的核心代码。这里面是核心代码。那时老师这个核心代码怎么写呢?思路当然很清晰了。从这个message里面取出。因为你现在你你现在其实已经拿到了哪一个message,拿到这个message了,但是你现在这个data message还没取出来,好现在我把这这个data message其实就是log进message,然后把这ID取出来,然后再组装一个新的这个message给他打回去,事情就结束了,好开始写东西啊,第一步,第一步先从这个message中。这个写一次以后就没问题了啊,先从message中中。
14:05
取出它的data message.data。并并直接直接序列反序列化成,反序列化成什么呢?这个呃,这个log。Log message,因为到这个地方,同学们如果到这地方,你不用怀疑,他一定是给我们的一个log message,因为我在这已经判断了。所以说你这个地方进到这个函数里面,你不用怀疑它的data部分一定是这个log,所以说这样代码就很简单了,Log进S。好,它的类型是message包包里面的这个logging。好,那现在呢,反序列化一下就可以了,怎么反序列化呢?就杰森点on Mar。Mar把我这个地方的数据传进去,因为你这个这个message里面有有有东西吗。
15:03
啊,我想想啊,反序列化。反虚的话就是它的这个点。呃,带部分。Data部分,Data塔部分,它现在。是字符串是吧,他现在。他现在是不是不串了。哦,那我看看我这边应该是不是该传个别的东西比较合理一点。呃,那到这个地方,我感觉咱们是不是这样做更好呢。这个地方。这个地方message。呃,处理的时候我能不能直接把data部分给他想想啊?我想看,想想这个逻辑怎么写更好一点。怎么写更好一点?啊,我们看这帮已经拿到它了,Data,那就切片一下也行,切片一下,嗯,把它改成这个切片BY。BAT切片转一下就可以了。
16:03
好,Message。好把它转成一个这个切片,然后把我们这个捞进这个类型给它放进去是不是就可以了。没问题吧,同学们。是不是经过这番处理,我们这个logging message就拿到了吗?就拿到拿到当然这边有可能有错误啊,有错误你接收一下就可以了。跟上思路,朋友们。L我说个今代码有有有点难啊,有点难有点绕,那么我输出一句话。PP,好,这边呢,我们就说这个反序列化失败了。反序列化失败。好,失败,把这个错误信息打出来。L等于L,然后呢就return,那这个时候就把错误信息也给它返回去了,Return好,如果这个反序的话成功了,好现在就可以去判做判断了,现在我们的逻辑是先不到数据库去判断,先判断死,大家忘了啊,我们现在逻辑是如果用户的ID。
17:16
用户,用户的ID为100。为100,密码为123456,我们就认为是合法的。100密码。密码等于123456,我们就认为认为是正确的,认为合法,否则否则不合法。不合法,那问题来了,你怎么判断呢?非常的简单,如果捞紧。Message,点它的user ID等于100,并且并且logging。Message。点user密码等于123456,好同学们,在这种情况下它是合法的。
18:05
他是合法的,否则他是不合法的。否则我们认为它是不因为现在我没有到数据库去验证,所以说我写死的啊,其实这段代码呢,到底为不为证,应该有一个到数据库去验证逻辑,我现在没有写。原先在写死的,那么如果合法和不合法怎么办呢?不合法。各位。现在你必须要做一件事情。因为如果是合法不合法,你现在就可以构建。一个叫做logging response message,把它打回去,对方接收一下,再解包就行了。但有的同学老师他为什么这么这么麻烦呢?因为我们现在是写的最底层的。TCP这种协议的。如果你这个整个逻辑啊,如果你整个逻辑是用外部来开发,其实非常简单,因为外部开发他把设计工作全部都给你做完了,由框架自己全部做完,你甚试看,你如果写个ru to的话,你这边填一个用户名,再填一个码,一提交对方就直接拿到一个表单了,那个表单里面把什么都取出来了,但是人家是框架帮你做,现在相当于你很孤独,你这些代码全是你自己写。
19:14
就代码相当于说底层这些东西全是你自己在玩。所以你没办法,你写的代码肯定复杂度要高,但是大家也看到,这样给我们程序员的一个什么好处呢?给我们自由度就高了,就是他把这些底层全部抛给你了,你自己去写,这是为什么?像C语言写C的,C加加的,他一般是相对底层一点的东西,好这个思路就这样子的啊,来玩一把。因为这协议都是我们自己在定,协议都是我们自己在定,那既然如此,咱们不啰嗦了啊,直接先声明一个,注意听啊先。先声明一个什么类型呢?就是我们要返回的这个这这个这个玩意儿叫什么呢?Logging啊这样子啊,呃,就是response response。
20:04
Response response。呃,Res,没事吧?来,先把它搞搞出来啊,Re ES message看清楚了啊,它的类型是message.me因为你返回的也是这个,这个东西现在类型我们已经可以确定了。而也是。一注意,这有点麻烦啊,Mes它的类型就是什么类型呢?就是message,第二,Logging。Response response type。好,它的类型咱确定,但是它的数据,它的数据现在还没有,它的数据要根据你这边来进行一个优化,所以说这是第一步做完了,紧接着再做第二步再声明。再声明一个什么类型的呢,就是这个logging。
21:00
No。啊,再声明,再声明一个这个类型。就你要你要把它封装起来嘛,但是logging logging。Re re message这个类型好,先写出来啊,VR。Logging。啊,这个这样写返回的log re。Message,它的类型是message点。老井,Response。哦,这个地方应该还少了一个东西。这样子才对啊,这样才对,这个类型好,写完过后,它里面的数据一共有几个,大家看一下,我们定好了,它的数据有两个,一个是cold,一个是error,一个是cold,一个是error,好,现在呢,Code和error我们都可以确定下来了。他的code怎么写在这,如果一旦成功,我们就给他一个code码,这个code码呢,给他一个200表示登录成功。
22:05
合法给他一个200,不合法,就说这个用户可能已经还不存在,你可以注册给他再来一个。两五百,这500呢,我们表示一个用户不合法,或者说用户不存在不合法,我们假定500表示表示啊,就是500这个code码,500这个状态码,状态码。状态嘛,表示什么意思呢?表示该用户不存在。好,那这样子的话呢,我们已经有了那个L呢,就根据的情况了,比如说说老师,我还想把这个L给代进去,可以的,你可以这样写mes,点它有个LL是个字符串,你可以给给他一个,就是说诶用户。呃,登录成功,那这个这个就错误就不要了啊,那这就他默认就是串,如果失败你可以带带一个信息给他服务器端,因为有时候除了这个码之外呢,我们还有一个描述,一般这个开发都是这么玩的,所以你可以给他来一个logging r message。
23:12
message.l这个L是他的信息描述,你可以给他一句话,就是表示用户不存在你注册在用。用户,该用户该用户不存在,不存在请从请注册再使用。请注册再使用。请注册再使用,OK,当然也可以写段英文,也就现在我们通过这方呢,把这把这个也做好了,做好过后不要忘了一件事情,你要把这个啊,Logging response给他填到这个这个message里面才能打回去,但是它目前是个结构体,所以说要序列化它。下一步。这是第一步。这是第二步。好,这是第三步,第三步就是声明一个这个东西,并并完成完成复制。
24:05
是不是有点麻烦对吧,其实其实整个逻辑跟我上午讲的是一样的,只是现在我们落地了,你肯定感觉到好像挺麻烦的,但是这种结构可以负责人告诉大家,你将来这个结构做好了过后,它很多业务需求你都可以可以满足,如果你这个结构比较单薄。稍微复杂一点的逻辑,你处理不了。而且也不规范,也不规范,所以第三个呢,我们完成第三步任务,就是干什么呢,将。将什么玩意儿呢?将这个家伙序列化。序列化好,怎么序列化?它非常的简单啊,对,我相信同学们都应该做过这个东西,做了好多遍了。然后等于。什么玩意儿呢?就是杰森点。Mar。然后呢,把我们这个要序列化的这个家伙放进去,结构体放进去,这是一个结构体,好,当然这地方呢,有可能产生一个错误,比如说L。
25:02
A。好A,这个地方我们看看啊。Error,这地方应该是有个right right。读回去A看一下,如果等于near。啊,如果不能赢二,这么我们就序列化失败了,所以还有还有待会逻辑啊,这等一个print l。好,就说呃,序列化失败。序列化air fair错误的原因呢?可以给他打出来,然后就return。啊,相当于说这个错误就给他返回去,因为有错了吗?如果这个序列话,没有没有失败,相当于说这个data已经是它的内容了,下一步第四步啊。将。将什么呢?将这个data data赋值给。夫子,给谁呢?给这个。给这个结构体。大家看是不是这个逻辑啊。应该是这样子的吧,应该是这样子的啊,那怎么给他呢?呃,非常简单,赋值就行了。
26:05
Res,点,终于拿到它的数据了,点。但是这个data呢,因为它的类型是字符串,所以说你还要把它这个切片。给它转一下完事好,第五一步又来了啊,因为你这个地方现在还是个结构体,现在对它再进行序列化。对谁呢?R message序列化,然后准备发送。对它对这个进行序列化。序列化准备发送了,准备发送,也就是说现在你已经把东西给他封装好了,就你你要发送东西封装好了,那怎么怎么怎么怎么序列化呢,老规矩还是得套。注意近啊得。A。等于把这句话粘过来。但是序列化的时候,这个对象发生变化了,是这个东西,这是我们真正要发生的东西了,好,然后if。
27:03
呃,这个代码我就粘贴复制一份。好,终于到这一步,最后一步了。也就现在经过这一番倒腾过后呢,我们把这些信息取出来做了验证,该干什么干什么了,最后呢,把这个要发送的214也序列化了,最后发送,发送的时候又是麻烦事。怎么发送去发送。发送显然不能够直接发,因为发送之前呢,为了防止服务器端给客户端那边也丢包,你这个逻辑还要重新做一遍。那这个就很痛苦了,因为你满反复的把这个封包解包,这个东西你都这样做的话,你何必何必呢,你不如把它也封装成一个函数,叫做right package完事了,这样子我们手上就有两个核心的函数,一个是read。Package这两个就通用了,一个是read,就read package,一个是red package这两个呢,我们把它做成一个工具函数,再把它封装成一个哈,一个结构体里面去就特别漂亮了啊来下面这一步最后一步啊,发送发送到这个data呢,我们干脆。
28:13
我们将其将其封装到一个right p kg函数中。好来风。啊,今天的代码量是确实很大啊,今天代码量很大。我写的都有点锻炼身体的感觉啊,锻炼身体的感觉好累好累这个代码。啊,太大了,这代码量right,因为它不但代码量大,它本身有点复杂,关键是代码量大,填写hello word我也不累啊,这个太动脑筋,哪一步错了都出都出问题好了,那write的时候呢,还是老规矩啊你呃,你首先得给我两个东西,一个呢就是连接,你要给我。
29:00
因为你要让我发东西,你链接不给我,我肯定拿不到啊,就是net下面的一个包啊,一个这个同时你还要给我一个什么呢。这个切片给我就行了,因为现在已经是一个字节了,你你就不要再转成字符串给我了,因为我在发的时候刚好是它,所以说你看这个地方right的时候呢,你看我定的这个类型是data by切片,好,这个就特别的到位,刚好我发的就是它。来data,然后切片好这样子你用完了,你看你你你能把这个go,你要学不好的话,说不过去了啊,就算没学,学会TCD编程,你够语言用的很熟练了啊,至少这样子的L。好,把它包起来,把它包起来。好,包起来过后呢,我们写段代码,那这个时候同学们啊,其实马上快结束了痛苦的经历,马上就束发出去,发出去对方来接的时候呢,我们这个RA的函数就可以通用了,好,因为它一读一写,这个协议就对上了。
30:05
好,那发送的时候老规矩,先发送,发送一个长度给客户端,就是发给对方吧,这个时候已经不在乎你是客户端还是服务器端的,无所谓,就说就是我们就发送给对方,因为这个read和read呢两个到时间客户端和服务器端是通用的,好先发送一个长度。长度给谁给对方,哎,这样子我就叫对方了啊,我不叫扣难伏击端了。如果我发给你。你你就服气,你发给我对吧,那我变服气了啊,发送给对方,刚才那个逻辑我们以前是写过的,把刚才那个逻辑拿过来为我所用。在这个地方我们曾经做过类似的逻辑,发长度的逻辑,当时是怎么做的呢?是这样子的,把带的长度。对啊,这段代码其实我不愿意再重写了,复制一下。
31:03
复制一下,放到我们刚才写的这个main里面,这个我们看对不对啊,Pkg u点好把data算出来,Pkt buff分没问题,放进去没问题,然后判断一个你写的写的时候是不是写了四个字解出去啊,这个可以的,这个这句话就没毛病,没毛病,如果这写的不对就不行。第三第二步发送这个就直接发送消息本身呢。发送。发送什么呢?这个data数据本身,因为我先发的是长度,再发的是data本身。这个就更简单了。这这个呢就更简单,因为先发长度已经发出去了,对方一定会接收到,因为你你那边一定是先读长度再去。读内容,这个是我们规定好的,那这个时候呢,也很简单,直接就这样玩,非常之简单。这个是right,但是发的不是他了。
32:00
发的是。这个时候这个长度。这个长度就应该跟它一样,因为你算出来了对不对,所以你这应该做一个比较,发出这个N呢,如果这个N不等于这个地方,那说明你发的你你你在write或者要发送的时候就出错了。对不对,好,这样子就进行一个比对,最后这个做完了过后呢,Return。好。这个right就写完了。他为什么错了?这儿多了一个冒号。同学们帮老师看一下啊。好,我们看还有很多错误。这地方错误的原因是。少了一个。等号。前面也少了一个等号。诶,我我我等一下啊,一一一两页跳82行也有错误,是不是这个地方的错误,是因为没有引什么麦这个包包,好先一步步的搞定它。
33:00
哎,这个赢了呀,买一包为什么还报错?啊,哪里写错了哦,这个地方哦,是不是因为我没有全部保存。全部保存,应该就有这个东西了。好像就没错了。哎,怎么一下突然没错了,感觉好怪啊,我还准备再调一调,没有给我一点时间的缓冲啊,突然就对了,那更可怕啊,更可怕,好,这样子呢,这个right package我们就可以用了啊,怎么用?因为你到这个地方不就一直等着要发出去吗?好,终于。82行有错是吧?哪里有?不要。呃,我给他的是一,呃,对对对对对对对,说的很对啊,刚才同学们说的很对,因为这种我返回去的就是一个log这个东西是吧。好,还有这样又一改,又出错了。这地方是不是没有没有匹配这个这个类型呢?好这个匹配类型,那么把它转成这个特。
34:02
匹配一下。哦,还有哪地方错,看一下这还有一个错误。呃,这个错误是因为没写代码是吧,没写代码好,最后把这个做完了之后,我们用这个right package把代码写进去。写进去啊,这样调试都不好,调试告诉大家错了,调试也很难,那你这要发的一个是把链接给我,第二个把data给我,最后这地方会有一个会是不是会有个L啊,会有给我已经收。我我也接收,然后呢,最后如果这个有问题,我们也把这个error返回去。老子就return就行了。好,写完了过后,同学们,你这个地方相当于说server process调用了它,它调用它过后呢,有在这个地方把这个A返回去,最后这个代码就写完了。写完,那么这个时候呢,我们这个就写完了,写完过后同学们回头写这边就说这边已经把结果发回来了啊。
35:06
回头现在呢,这边还没有接收你给我返回的消息呢,所以说在客户端这头呢,我们要来去接收哪一块呢,接收他返回来的这个结果到底是克的码是多少,来做一个小小的改进。找到这个客户端。我们发送完了过后再看。我这直接休眠,不能休眠了,别动,好,我告诉你应该干什么事情。这里还需要处理服务器返回消息,我们终于拿到这个东西了,Read一下搞定,那么你read这个函数呢?其实在这个地方我们有没有read?是不是还没有写read呀,这个readid其实你服务器是有的,那么这样子的话,其实这个函数完全一样,因此我做一个这样的小小的文件啊,现在样写写一个最简单的UTS点购。那么其实这两个函数我是可以通用的,于是乎我从这个my me server的me这边,我把这两个函数拿过来为我所用,一个server,一个是read。
36:09
这两个是通用的。完全没有任何问题啊,肯定是通用的,因为你message定的是一致的,所以这这两个函数呢,我直接不犹豫了,直接。复制粘贴一份。图纸粘贴一份粘贴。粘完了过后,我们把这个包包,把这个打一个包,Package什么呢?U tea,然后inport的东西很多,你不要一个写了,直接从这个闷里面粘一份过来,看哪些需要的全部111块性的粘过来啊,哪些不要直接它会提示你没用上的,把它干掉就行了。好,首先这个这个L好像是没有保存一下同学们。保存一下。保存一下肯定会会爆。哦,他说这个地方为什么package。不至于的。呃。
37:02
我没有放错吧,应该是放这儿的呀。放哦哦对对对对对对对,说的很对啊,这个还在面包,你们跑跑别的地方去了是吧。好,IO,他说是没有用到,删掉。好,还有什么问题没有,还有log这边有问题了,是不是你还没写呀,好开始,那这个时候呢,我们调用read。Read p kg,这个read p kg呢。看他要穿什么,参数进去没有。啊,它其实就传一个连接。就把这个message传给我们了,好,我们要的呢,也就是他。好,最后他给我返回的是一个message,这个message就是真正的返回结果了啊,然后呢,有个L,注意最后的代码差不多快写完了。好,现在呢,我做一个小小的一个判断。现在判断它内容是什么啊,就是说你现在这个message其实已经给我们返回是什么类型,大家应该很清楚,他返回这个message,因为我读的时候已经把这个包封好了,对吧,这个message就是里面的它的这一部分啊。
38:14
呃,我们这边是不是还要做一个做一个解包的工作呢。因为你还要看到它里面这个代码是多少是吧,这个简单,这个简单message。点把它代取出来,就直接反序列化。将message的这个data部分部分反序列化。反序列化成什么呢?成这个结果成logging。Logging response。Response message OK,这个很简单啊,大家直接这样写就行了,比如说我直接写,呃,咱怎么给他做一下呢,就叫这就要这个吧,直接取名了啊。Response message。
39:01
好,然后呢,它有一个error,有一个error。好,这个地方如果读错了,我们就不玩了,If a不等于near,不等于near,我们直接打印出一句话,什么话呢?就是你read page给出错了。Read package error。把这个输出来。好,不玩了。因为他。如果说读的是正确的,好,我们把它反序列化,反序列化的时候呢,就用这个jason.on Mar。然后这个地方是message。点它的代塔部分,这个代塔部分呢是一个字符串,把它转成一个切片。转成一个切片,转成一个切片过后,各位然后呢,直接把它放在一个结构里边去,比如说这个地方,我们认为它应该返回的是这个类型,所以说logging r message,它的类型是message。第二,Logging。
40:10
Logging re res message,好,就这个类型,那这个类型的话呢,我就直接把它放进去。取啊,取一个例子符。好,取一个例子符过后,这个结果我们终于拿到了。这个结果就拿到了,拿到过后我们做一个判断,如果捞紧。Res message。啊,它的这个啊,Response啊response它的这个code。主要是看透的,如果它等于200。那么说明这个用户登录成功。登录成功。登录成功了,那如果说它不等于200,而是等于一个别的值,比如说500。比如说你这截取回来的这个码,它是属于多等于多少呢?等于500,说明这个用户不存在,就需要我们注册对吧,甚至你可以直接把他这个信息打出来也行,说老师你这写这个太麻烦了,我直接这样子点也可以啊,就看你成功我们自己打啊,失败我们把错误信息打出来。
41:20
啊,这个下一步我们把这个这个取出来。那错误信息是什么呢?错误信息可以通过它这个结构体里边带回来,第二它里面有应该有个L,因为我已经封到里面去了。好,我们代码就写完了。那这源代码呢,我先保存一下,看看能不能跑起来最关键啊。好气们有问题。他说不能这样。因为我前面已经定义过了。好,基本还有错误是为什么?不能够分配一个,只给两个。
42:04
好,我是不是只换一个error,哎,这个这有有病啊,这个写的这个干啥。好,还有吗?还有一个错误。还有一个错误是time这个地方用不上了。好整体再保存看一下啊。在吗?经过一番这个挣扎,咱们就写完了。嗯。刚开始呢,大家这样写会觉得有点麻烦,但是你用久了过后你会发现,其实这种逻这种这种封装呢,它能够适应很多需求,其实说白了就是一个逻辑发出去之前。因为他这个网络发的时候,他只允许这个关键点在什么地方,就是难,为什么会觉得很麻烦呢。根本原因是在两点,第一个网络传输,它只允许是字节。而我们在在程序里面操作呢,却要求是结构体。
43:02
所以因为你网络传输的东西和你程序里面操作的这种类型不一样,导致你在程序里面要做大量的转换工作,大家想是不是这个道理,你看你你在你在真正这个逻辑里面,一定要用结构体的类型,你才能玩,但是呢,你要发送的时候,你首先还要把它序列化,序列化过后还要搞成一个这个纸质页码发过去,发过去那边还得取,取完了过后还得把里面内容取出来。它的难,难度肯定就增加了。而这些底层的工作,如果你是用web开发,如果你是用的we开发,这些老师写的这些转换工作,全部由底层的框架帮我们做完了。而你现在用的是什么TCP?你如果是TCP,变成最恐怖的动作,是因为没有外部服务器了。没有外部解析器了,比如你用PP,你用这个Java,为什么你会觉得简单,原因是你有汤姆凯特帮你接收,你不需要写这个传输的连接,不需要你管了吧。第二个你有一个汤姆凯特,汤姆凯特会帮你解析这些东西,你直接结果就全部拿到了。
44:07
而你TCP是个什么东西呢?服务器完全是你在写,解析也是你在写,所以代码一定会比那个复杂,这跑不了的,所以说我们经常说写CS的,从底层来说,它一定难度要大于直接写BS的,因为你没服务器,服务器是你自己在写,协议还是你自己在定,所以难度肯定要大,所以大家通过这个呢,也也好啊,就是大家一下认识它的本质了。以后你再学web,可以这么讲,应该很轻松,至少你比别人认识的这个底层的东西要多很多很多。所以这个呢,还是。付出还是有回报,那最后呢,就是一件事情验证我们这个没有成功,我们现在如果是输入100和1123456,只要提示成功,如果输出别的地方,输出一个用户不存在,那么说明我们整个代码是通的,否则。那。今天就不知道什么时候下课了啊,来玩一下啊,我们希望早点下课,我也想早点下课啊,来朋友们玩一把。
45:07
编译第一把过去了。哎,那个小龙,你看到我这代没有错误,你就直接说有没有错误,这看出来没有没看出来啊,你要有发现错误,你赶紧告诉我,别故意折腾我啊。同学们发现错误就直接给老师说,我们尽量呢一次性搞定。这样呢,大家可以赶紧吃饭去了,走。好,直接上这个登录啊,先输一个不存在的用户100。密码我我输一个错的,比如说我输一个12345,这个不对。看这面有问题了。哎。他为什么卡着呢?是不是又没有给我那个编译啊。你看还给我修炼20秒才退出去。估计。
46:01
哎,这个地方是为什么呢。读取客户端发送的数据。看一下这个问题在哪里啊。好,我们来调试一下这地方的问题之所在啊,问题之所在。啊,刚才错误原因,好,同学们,那刚才就是为什么会出现这个错误呢?就是因为我们在服务器端,大家看到这里,因为你在这处理这个不同的携程的时候,你得把这个server process message调起来,你不调那肯定不行的,所以说我们少了一段代码,就是刚才那一段代码什么呢?就是error。走,等于调用我们这个辛辛苦苦写的这个server process,然后把CN传进去,然后呢把at的符号传进去,把message传进去,最后通过它的一个判断,如果error不等于near等于near,然后呢,我们就直接return不玩了。
47:00
但可能很多原因,有可能是对方直接把这个链接关掉了,也不玩了,也有可能是其他什么原因,反正出错了,出错咱们就不玩了,好,主要是这个地方错了,把这么一写代码就没问题了啊,我们再把它演示一下啊,编一下一对编一下一。客户端这边呢,它刚才提示两个退出登录成功,我们把它改成一个会比较好一点,它为什么提示两次,我们来看看。啊,我们来看看为什么它提示了两次,打开这里这个地方提示了一次。这个地方提示了一次,那还有一次登录成功在哪里提示的呢?哦,我明白了,是因为我们在主函数里边,我们还傻傻的写了一个,应该还傻傻写了一个在这儿,是不是在这儿我们还搞了一次啊,是不是这也没必要了,这就没必要,其实这地方的判断意义也不是特别大了,因为里面我们就都已经判断完了,所以这块呢,意义不是很大,所以说可以把它注销。
48:01
可以把它注销,你明白这意思吧,OK,诶这个注销了,为什么他报错了。啊,因为这个A没有用到,没有用到的话,那就干脆对不对不要了就行了,是这意思吧,OK。好,同学们,我们把客户端也来做一个小小的编译。好,同学们来测一下啊,现在呢,把两头都打开,就是因为那那段代码没有写写出来,搞得我们这个郁闷了一会儿,走,等待连接来client。好,输入一个一,输入一个100密码,下出一个123,好用户不存在,请注册在使用这个是服务器端给我们带过来的错误信息,再重新来连一下,输一个一,输100密码,123456 OK,登录成功,好代码OK了,好同学们,那关于这个功能呢,我们就一个登录成功,你看咱们就写完了。当然有些同学说说,诶这个东西怎么这么麻烦,我反复强调几个原因啊,第一个服务器完全是你自己在写,协议是你在定,你显然就相当于说搞了半天,你相当于自个写了一个小的服务器了已经。
49:09
你这个还算代码量大吗?不算什么。要不然你要用汤姆凯特,用一个汤姆汤姆凯特或者是或者是像我们pap的那种解析器是吧,那他就简单很多了,因为它那个东西底层的连接全部是由人家在给你搞。那你还有啥事,所以这个肯定难度要大一点,很正常啊,很正常,那我把这个代码呢,给各位朋友整理到我们的笔记里面去啊,稍事整整理好,在这个地方呢,我们继续完成就是,呃,完成什么功能呢?诶,完成了这样一个功能,就是从。就是能够能够完成完成登录并提示提示啊,提示相应的相应的这个信息,相应的信息。OK好,我把这个代码呢,简单的给大家整理一下啊,整理一下那这样子啊,这个代码呢,我给大家整理一把,整理一把,我们看是完成了哪些功能,在原先基础上加了哪些东西,把源代码直接给你们反而不好,就说直接你你你看都不知道怎么看。
50:14
你看都不知道怎么看,肯定是这样子的啊,那么我们看我们是加了哪些东西呢?在原型基础上加了哪些东西。好,首先我们是在服务器端做了一些工作,对不对,Server这个这边我们写了一个面点go,在这里面加了几个做了修改了做了修改。做了什么修改呢?我们来看一下哦,原来是做了这么一个修改,首先呢,我写了一个这个函数。然后我还写了一个right这个呃,这个函数。啊,这个是新增的,这个是新增的,所以说呢,先把这两个给它截过来。啊,一个是这地方先做了个调用,先把它调用放到这儿啊同学们。OK。
51:00
好的,各位朋友。先把它整理一下,诶先把它整理一下,这个第一个是在服务器端的,我们做了一个增加了一段逻辑。增加了一段逻辑。就这。好,我们根据你的消息不同呢,让他去处理,这相当于是像其他框架的一个总控啊,有点像那一个总控总控制器,好我把它呢放在这里对不对?好,这是第一个地方改了,第二个地方呢,我们还增加了两个特别重要的方法,一个是这个server process message,诶这个呢,它是决定哪个函数来调用,所以它也很有用。它也很有用,OK,第三个呢,我们还增加了一个具体去处理登录的这么一个函数,这个函数呢,相对代码量大一点。啊,等等等,其他你就可以照这个套路走了。照这个套路走了。好给大家截取一下啊,同学们,这个是67行到89行对不对,89行OK。
52:07
好,然后呢,89行继续往下截取,诶89行继续下截取,就是90行到最后这个瑞好,这次服务器端在上面的代码上做了一点点改进啊做了改进,然后紧接着呢,服客户端这边我们做了哪些工作呢?诶就看到C。Client呢?首先我们增加了一个函数叫UT2,这个函数好像还没用上,好像。这个函数还没有用到啊。没有用哦,用到了用到了,用到了用到了,对用到了里面那个方法我用到了啊,诶这是增加的,这新增的。新增的好,那这个地方我们增加的是什么东西呢?就是把它的这个read和一个它的right呢,这个封装到这个函数里面来了,这是第26行。好把它放到这个位置来。然后呢,接着往下截取26 27。
53:01
好,这是27行到51行。到我是一行。好的,第51行呢,接着往下走,诶,51行接着往下走。就是52到最后,诶52到最后OK。好,最后一个呢,这边把这个加进去过后,我们还做了一个改进,就是在这个命啊log log进点go里面做了一点点改进,就是获取它的package,然后呢,做了相应的一个处理。哎,在这做了一点相应的处理,就这段代码。哎,这是我们新增加的哦。这一段是我们新增加的,对,这是我们新增加的代码。好,这个是在哪里面新增加的呢?是logging啊,Logging在我们的这个。C。点这个logging logging.go我们新新增加了一点代码,增加代码。增加代码OK,好同学们,那关于这个这个功能呢,这部分功能我们就做完了。
我来说两句