00:00
各位,我们接着前面讲的内容呢,继续为大家讲解这个聊天室的一个功能,那前面呢,我们已然啊,我们已然通过这个自己的一个努力呢,我们可以到数据库去验证了,而且呢,也打通了服务器,它跟red之间的这个通道,对不对,打通了,确实是打通了,那现在呢,我们来完成下一个功能,你看这边又是一堆代码啊,那这个代码呢,大家看起来多,其实呢,有很多代码是重复的代码。甚至可以简化的代码,OK,那现在呢,我们要完成这样一个一一个任务,就是实现注册用户来,把它写到这里来,这个是实现注册用户,好这个功能呢,我们该给他来一个标题三。标题三,也就是说前面这功能是实现用户的登录,现在呢是完成用户的注册,对不对?所以这块呢,又是一个相当于是一个新的功能,但是我们花了很长一段时间去完成这个登录,为什么呢?因为它有很多前期的工作,包括协议的定制,包括这个,包括这个框架的改进,我们全部都放在完成登录这去完成的,其实你要是到后面来说呢,这个理论上说这个代码应该越写越轻松。
01:19
越写越轻松,因为你前面有很多工作是属于大家共用的部分,OK,那现在呢,我们直接就来说完成这个注册,我们要做一个什么事情呢?看功能各位朋友。那么现在呢,我们要完成两件事情,第一件事情就是呃,第一件事情就是呃,完成这个注册的功能,并将用户信息录入到中,就说就说这个用户他可以选择注册。他可以选择注册,然后呢,我们就把这个用户登把它放到里面去,OK,那思路分析完成代码,我们来看一下这个思路分析呢,相对来说就比较简单一点了,看看这个分析的示意图。
02:03
思路,思路。思路分析的一个示意图,那么我准备怎么干呢?各位同学,我准备这么干啊。呃,再说一下,就说我们每个同学完成这个代码呢,只要在我讲的这个架构的这个前提之上,你用什么名字,甚至多一个文件,少一个文件都不是事儿,但是呢,你在写代码的时候,你只要体现出我讲的这种。分成的这种模式就可以,并没有说一定要按照怎么写,没有这个说法,但是我这种写法呢,就是相对来说比较就是大众化一点,或者说企业里面呢,他经常用这种方式比较多,所以大家可以借鉴,比如有些同学老师,诶,我的名字不这样取行不行也可以这个没有说一定这么取名字啊,来我们完成这个注册,那么既然是注册,同学们可以想象到啊,想象到你既然注册,你想你的思路应该是怎么样子的呢?
03:00
应该是什么样子的,首先你想你是怎么登录的,你既然知道你怎么登录,你就应该知道怎么注册,你想想你原先登录你怎么做的呀,你是不是现在message里面增加了登录的这个消息的类型,以及登录响应的消息,对不对,那我们也应该这么干嘛。因为它是一种消息,就带着一种一种业务逻辑。这个很正常,这个很正常,所以说我们第一步呢,应该是在这个地方加入我们新的一新的这个,呃,消息类型,这个是第一步咱们要做的事情,对不对?好,第一步呢,我们要在这里就是这样写啊,完成注册的这个思路,大致应该是这样玩的。OK,我呢,在这里写上一个,呃,我的一个思路分析就是完成。完成注册任务的一个步骤也好,还是思路也好,都可以都可以,那第一步,首先我们要在message里边定义两个新的。
04:09
消息类型,因为你一个发送一个回收嘛,很正常,所以说现在哪里呢,在这个message文件common。Common这个common这个下面有个message,下面有个这个文件,点go,我们新增。新增加,新增加两个,两个消息类型,两个诶写错了啊,两个消息类型,这个很正常。那我们先把这个事情做完好吧,我们一步一步的做,因为到这其他大体大家也知道该怎么干了,打开code,打开Vs code,那以前我们这已经有个register,呃这个message了,那可以照用,那大家想一想啊,大家想一想,你作为一个注册的消息类型,你应该给他传什么进去呢?
05:06
应该要传什么信息去呢?显然这个时候我们应该是传一个结构体进去更合理。OK,也就是说我们原先写的是int寸,这种方式呢,是单个单个的写。现在呢,既然我们已经定义了user这个结构体,那么何不这样做呢?各位同学,我就直接这么玩,User,对user,然后呢,我们这个类型呢,这个类型就是这个user user这个结构体。哎,这样子的话就相对简洁一点了,因为你将来这个UR结构体的信息增加了,我就不需要每个一个字段一个字段加了,因为当时我为什么用这个呢?因为我们现在我们当时还没有这样的一个知识结构,所以说老师用的比较简单一点,现在既然有这个了,那我就把这个加进去,对不对,诶这样的呢,我们就可以这样写,怎么写呢?
06:04
就是干脆啊,干脆我们这样做,我们再加一个步骤,就是把user,把user这个把user这个文件呢,直接也放在这个这个要共享的这个目录下面去,也可以也可以,当然了,有些同学老师我不放这我我嗯,我把这个user放到这边来,可不可以也行。啊,总而言之呢,你肯定是要让客户端用到这个user定义的这个结构体,这是肯定的,所以说我现在这样处理一下啊。现在我应该完成第一步先。先把先把这个user.go放入到,放入到哪里呢?放入到这个common common message这个包包下,文件夹下,文件夹下。啊,把它也放在这个包,也放在这个包啊,我也放在这个包,但有同老师我不这样放,我是不是也可以也可以,我原先讲过啊,共用的部分可以写在这,也可以每个人拷一份啊,也可以每个人拷一份,那么现在呢,我就采用这个比较简洁的方式,我就复制一份啊同学们找到我的server里面有个userr文件,我复制一把,然后呢,我把它放在这个地方,简单一点处理了。
07:22
那既然有了这个user结构体,那现在这个包包呢,就应该发生一个变化,就相当于这个是为谁用的呢?是给这个客户端用的啊后面呢,你要是把这个改一下,也可以让它共用,那就写message message,那message这边写完了过后,那这个地方就变得简单了,它的类型呢,就是user。OK,他的意思就这样,当然有很多小师这样写会不会报错,这样不会报错啊,这样哪写错了。Message。啊,他这么难道不能这样用吗?不应该呀,保存一下。应该没有问题啊,前面这个是它的字段的名称,后面这个是类型,它是可以区分的,它是可以区分的啊,可以区分好这个这个第一个这个步骤呢,这个就这个类型,好,紧接着呢,我们还要定义一个类型,就是将来呢这个注册,注册完了过后,他会给我一个响应的类型,这个响应的类型呢,其实跟这个登录的类型其实长得非常的相似啊,非常相似,好这边应该还有一个有个这个吧。
08:28
Jason,好,Jason来个user好吧,改改成这样一个名字,改成这样名字user,好,那现在呢,我们还要定义一个register register response message。好,Struck。Tru。对structure,那这个structure它的这个这里面有什么东西呢?我我们认为它也有code和这个错误描述。他有错误描述,但是这个注册的时候,注册的时候它返回的状态码呢,咱们可以定一下,比如说200表示什么,500表什么也可以啊,呃,这个就改一下,500表示用户这个已经,呃,我们这样写啊,比如说有一个代表用户已经占用过了,占用过了,比如说我这个时候500呢,我们写不同的状态码吧,比如说占用,一般占用呢,咱们用一个400吧,400表示该用户已经占用了。
09:29
该用户已经占用。已经占用啊占用。占用。占用那么200呢,表示注册成功,200表示注册成功。好,这边是返回的错误信息,大家可以看到,嗯,目前这个响应的注册的响应的消息呢,和登录很像,按理说他们可以共用,他们确实可以共用,因为其实也差不多,但是呢,从这个将来从扩展性来说呢,我还是把它分开写,因为你没准保不齐register将来增加一个什么字段,对吧,所以说我这呢就先这样子保留,那这边呢,我们要新增加一个,好,再新增加一个register响应返回啊来走一个叫做re response type。
10:21
Type,然后呢,它等于什么呢?它就等于它的前面这一部分OK了。好,同学们,这块代码咱们就完成了啊,这块代码我们就完成了,就是做了些什么事情呢,把这个user拷过来,同时呢,把message新增加了,好我把这个呢给同学们先整理一下啊,思路分析啊,步骤完成。步骤好,这个写一个步骤啊。实现。实现这个用户注册的一个步骤。好,我给他来一步啊,来一步。好,待会再再再再写啊,现在可以继续往下,待会再整理这个代码吧,先整理代码好,这个做完了过后呢,我们来往下面接着走,下面应该做什么事呢。
11:11
好,下面这一步我们想哈,既然你这个两个呃,类型已经定好了,我们下面这个步步骤呢,应该这么玩了,第三相当于是D这个步骤啊,这个相当于是一。这个相当于是一,这个相当于二,这第三步,那第三步呢,我们肯定要想办法去在这个界面去接收这个用户的输入,对不对,这很正常嘛,因为你你要注册,你肯定要输入用户名,用户密码,可能还有一个用,还有一个这个呃,就是ID,我们都都需要接收一下,所以说第三步在哪里呢?在。在这个客户端这边,在客户端,客户端接收接收用户的一个输入,接收用户的输入其实就三个三个信息好来玩一把,那现在现在呢,我们找到我们找到他输用户名密码这些地方找到客户端同学们,那客户端呢,他在这个地方写的哦,注册用户好注册用户,那我们就玩一把了啊来玩一把,那就提示他信息。
12:19
说请输入,请输入用户的ID,用户ID,假设这个ID我们是指定的啊。呃,将来真正式来说ID呢,最好还是让后面自动分配更好啊,我这里呃写了一个逻辑,让他自己输入,大家体验一下,因为我想让大家感受一下这个用户ID存在的这个是怎么返回的,好,那么这个也很简单,就是format scan。SCNF,好,因为它是一个整数,所以说呢,咱们百分D斜杠N用户的ID,我们直接传给这个变量。OK,第一步写完了,第二步让他输入自己的一个密码,请输入用户的密码,各位你要设置的这个密码,这个密码呢,诶前面我们也定义了一个全局变量,也用它就可以了。
13:11
来吧。写到这,比如ID,那这个呢,应该是个字符串,对,是个字串,好我们再让他去指定一个用户的名字,其实就是昵称啊,那么我们再让他输入一个用用户的名字,输入用户的名字啊名字。那这个呢,你也可以写成叫昵称Li。好,写完了过后呢,这个用户的昵称现在没有,没有的话呢,没关系,我们就先增加一个好user name user name是一个尊类型的,我们接收它。接收到这里,那就改成这个user name好,当我们把这些信息都拿到以后呢,各位同学,各位同学咱们应该做什么事情呢?一样的,你看这个套路已然出来了,我们也创建一个user process,让他去帮我们完成注册,你看这个步骤已经不需要你再动脑筋了,它的步骤还是一样,只是里面代码呢,大家去写一下啊,OK,现在呢,我们就要开始第三一步啊,就是干什么呢?就是创建就是创建啊,就是呃,调用,调用一个什么呢?这样的一个实例。
14:22
调用这样一个实例,完成一个完成一个注册的请求。注册的请求,因为你这个请求是发给服务器,服务器帮你完成注册对吧,所以说这个步骤还是老规矩,先把这个搞出来。先把这个搞出来。OK,搞出来过后呢,方法还没有对吧,所以说没有我们先就写一下,好,这已经接收用户输入第四步。在哪里呢?在这个地方,各位朋友在客户端的user process去编写一个register的一个方法,它和这个logging很像啊,Log很像,后面这个代码都可以在优化,有很多重复代码,咱们把它可以处理的啊,好在这写一个这样的方法。
15:07
好在他这个地方在这个客户端。的哪个地方呢?Process这个文件夹的user process。点够增加,增加一个什么呢的方法。Rain。Register的方法干什么呢?完成请求注册的任务,请求注册。这当然注册这个事情是你请求,然后我帮你去服务器去做好这段代码呢,咱们就写到这来整一个啊。好,那我就不说,不写注释了,直接上代码了,直接this新user process跟上老师思路啊,叫register,那大家想一想,你注册的时候你是给我填三个信息,那么呃,你登录是填两个信息,那注册应该给我填三个信息,这个很正常,对吧,应该把这个名字再给我一个user name,所以你看现在已经有有一个套路在里边了,因为这个太长了,所以说我们可以换一行。
16:13
换一行过后呢,这边返回的错误信息仍然该怎么返回怎么返回。好,下面的代码,我相信同学们应该是有套路的。你看你原先怎么做,现在就怎么做。对吧,你注册好,那你注册你肯定要连数据库了嘛,因为你这个注册可能是人人家还没有,因为他没登录你你登录没有成功嘛,肯定是没有连接的,所以说呢,下面这个代码其实非常的像我们看哪些可以直接用啊,走走走走走走走。好,来,这一部分咱们是可以用的,你看这一部分可以用,你到时间可以把它封装成一个小的函数啊,这部分可以用,接着往下走,下面哦,他说准备通讯发送message,这个也没问题,但是各位同学,我们看这三步哪个地方要调一调,哪地方要调一调,因为你原先发的是logging,对不对,那现在我是register,是这意思吧,所以说叫register。
17:12
一个type类型,那么这个类型给他过,那这个地方名字咱们就最好叫register了,Register类型好,它的也在这个message里面,它是register的一个,呃,类型就是应该是这样写的,A re。Je,没问题吧?它的它的类型是message,然后呢,这里面的变量发生一个变化,第一个ID也有名字有,但是呢,这边是传过来的,但是我要增加一个东西什么呀。用户名给他对不对,哎,所以说register不要写了,复制粘贴一把。然后那地方改成呃,在这个register里面呢,这样写就有问题啊同学们,我这样写是有问题的,应该是user,大家看能不能理解,因为你这个register message里面,它不是单个单个的,它是一个user这个结构体,再点它的。
18:09
呃,那个自动这个大家应该能理解吧,这个这个理解不了,那那说不过去啊,这个我我以前讲过,第2OK,把这个信息给他,大家看能不能理解这句话。这句话大家一定要要好好理解啊,怎么为什么诶。哪个地方没有改呀?啊,有点name没有改对的啊,所以说这地方呢要改一下,不然待会就会错误。好,这个呢,大家应该能看懂,紧接着往下继续看哦,这个地方写完了,那么第四一步是不是要完成一个序列化呢?肯定要完成序列化,你才能发送嘛,你你先要你先要把这个东西register这个序列化完了过后才能扔给他的data是不是好,这个是,呃,很正常的一件事情,好,第四一步照着照门画虎,照门画虎第四一步,诶,你就粘贴复制一把,将它进行序列化,就改一下了,将这个register message序列化。
19:12
说这些呢,将来还可以把它进行一个呃统一好的代码也很简单复制过来。啊,这个我就不动脑筋了啊,把它这个拿到了序列化的代码没问题,第四步复制过来,相信大家能看懂,对,那这个时候我把放进去。那放进去过后呢,得到一个data,如果有错误,包括错误信息,下一步第五一步,第五一步呢,它是把data给它设置字段,这个很正常,我们应该也是这样做的,哎,看看这个名字是不是叫message,没问题,带他给他,但是呃,这个也没问题。好,第下面一步第六步,第六步呢,将这个message再进行序列化,因为你现在还是一个结构体嘛。
20:00
对,好,这一步呢,也是儒法之炮制。如法跑出,你看这代码很像啊,诶,第六步OK了。啊,这些将来都可以封装起来啊,单独的封装一个小函数,好,然后这个做完了以后呢,第七步,第七步就应该先发送这个长度,老规矩不说了,好把这一块整体复制。好,这个哪个地方要改一下就改再改啊OK。哦,这玩意本身是一个方法是吧,可以直接write,直接直接write出去了,是不是可以直接write出去了,呃,直接是它这个地方可以封装成一个方法,那么我们可以直接从一个方法把它right,就是它的right,实际上是从这个位置,从这个位置一直到。到这个地方都是right是不是,哎,那这块我们是不是已经有一个函数,一个是right,一个是read,是不是就已经可以拿来用了呀。
21:02
这个不是,你看这个函数就发挥了它巨大的什么呀威力,对不对,好,那现在呢,我们就来玩一把,先创建一个transfer。先创建一个transfer。好,我们代码呢,就有用了。OK,创建这个翻是不是。这个肯定是没问题的,Connect我们也拿到了,因为本身就在这拿到的,那现在呢,我们先写在接受好发送,发送哪个呢?Data data给服务器端,这个大家应该能看懂。那怎么发送呢?TF点它有一个。它有一个呃,我们写好的方法叫right p。什么玩意PKG那PKG呃,要给他传什么东西进去呢?大家看一下。是不是要把不是这个玩意儿是这个data塔的一个切,就是BY一个切片,是不是,那BY一个切片,那不用犹豫,不用彷徨,咱们呢,找到它就是这个玩意儿,是不是就这玩意儿好,那么他目前已经是个它是不是已经是一个bad的切片了呀,不用犹豫了,那么它这这个地方应该会返回一个,返回一个什么东西啊。
22:18
返回一个,我们看看返回的是什么内容哦,它返回一个error,如果有错呢,我们给他提示一下就可以了,Error等于好error呢,这边本身也有一个命名参数,好像已经有了,直接用好,那就写一句话,如果error它不等于near,是这意思吧,它如果不等于near,我们就说right包包出错了,那给大家一个小小的提示。啊PTN啊,我写一句话就说就是,呃,注册注册注册发发送包发送发送这个这个信息出错了,发送信息错误,那么我给他打印出来。L等于OKOK啊,同学们不着急啊,这个呢能写完好这个你把它发送完了过后,是不是意味着对方会给我回复回回送一个提醒啊,同学们,因为你发完了过后呢,对方他会说,诶到底成功了还是失败了,他也会给我回送回一个包包,这个包呢,这地方我们已经有了,好那就是说写完了过后,我们再读这个包包会把返回一个新的message和一个错误,对吧?好,那这段代码我们就如法炮制往这走。
23:31
发完过后我们再去读。读的时候呢,同学还是TF来读,读完这个地方有错误就有错误,没有错误再说好,如果读的话有错误打印出来这个message,同学们,这个message大家想象一下就应该是这个register,这个就是register register response,这个message大家能理解哈。因为你呃一个发送我给你回应嘛,OK,那现在呢,我们对这个对这个信息进行一个简单的一一个判断,你看这边是怎么写的哦,他是这样写的,如果成功怎么样,失败怎么样好,那么我们也如法炮制,但是这个注册呢,我是这样子的啊,注册我们就退出,让他重新登录就行了。
24:15
好,我这就简单一点,那我把这个东西拿过来玩一把。来看代码啊,同学们跟上老师思论。跟上老师的思路。好,我把这一段代码复制到咱们的这个这个地方来。好,我们来改一改,首先我们要确认它返回的应该是呃,Register register的啊,其实这两个很像啊,可以通用,好,但是从这个意义上呢,我们还是区分一下response,好,这边也把它改一下。改完过后呢,进行一个反序列化,Message里面带反序列化,给这个变量哦,这么写小写就可以了,Response message,好,这边我们做一个判断,如果等于200,如果它等于200,我们知道仍然是正确的啊,这个是仍然是正确的,看看啊对,仍然是正确,那么这提示一句话就说注册成功,我们因为注册完了,我们是这样做的啊,注册完了就完了,然后呢,相当于数据库里面有东西,我再重新登录,提示他一句话注册成功。
25:24
For my point and,好,写一句话吧,就说注册成功了,注册成功OK,可以重新登录,你重新登录吧,重新登录一把。OKOK,那么如果嗯不是200就说明他这个注册呢,会有各种信息错误,我们把这个错误信息呢,给他打出来还是用打,打完了过后呢,我们呃,我们就不管他那么多了啊,整个这个做完以后呢,我们就直接退出,我们不玩了啊,就说简单就这样处理一下就说。处理注册完了过后,我们先先退出啊,先退出我们不玩。
26:03
好。呃,这样子的话,我们看看有没有他这是谁来调用,我们看看啊,Register是谁来调用的呢?是这个地方来调用的,同学们回到我们的命点go。是这来调用的,它如果一旦返回的话,那说明整个哦,它是一个死循环吗。哦,他这边是一直循环还退不出去。还退不出去,那我就在这儿,只能在这退了啊,我只能在这退了,同学们,不然话我退不出去。那我在哪退呢?我就直接在这退就完了,我也我也简单一点,就注册成功还是失败,我都不玩了,我就退了啊先退一下这里我们就退出。那对方也不也不return了。那呃,看语法上它会不会报错啊。语法上会不会报错,我应该写到这儿,我怕这儿写到他,他可能会报一个语法错误吧。IT0直接退了。
27:01
这样报的话,肯定他是要报一个达不到。好,首先这个包没有移。好,先把这个包引进去,我就直接退了。好,看看这帮应该有语法错误。那他为什么这没有错误呢?没有错误。最好把这个写到里面去吧,啊,如果这个成功了和这个都失败啊。他都进不来,那这个地方没有它语法又过不去。你看他们会报错啊,他说你少了一个return,那把这个打开呢,打开我看他有没有报错。打开他也他也可以接受啊,他可以接受,那就先这样子啊,就说我我不成功了也好,失败了也好,我先退出去,让你重新再登录,就这意思,而外面呢,因为是个那个菜单是一个循环显示,所以说我这还比较麻烦啊,或者这样做,或者这样做啊,嗯,或者这样做也行,同学们,从目前这个逻辑上来说呢,我也可以这样干,如果这不退出我,我还还只能这样子了,还只能这样子。
28:08
只能这样子,那先这样先处理吧。好,呃,现在这个代码就没有报错了啊,客户端这一块我们就做完了。做完了,而且也也应该可以发送这个东西了,那也就是说现在呢,我们在user process里面增加一个register,它也可以发过去,等待你的连接好,相当于从客户端这块代码就写完了。客户端代码就写完了,但是你这样写完过呢,没有用,因为你服务器端没有把这个八个的用户入库,就你你这个这这条线没有处理,所以你现在呢,要开始写服务器端对他处理好,那关于刚才写的就是注册的。这个注册的这一块客户端的代码呢,我们就先给大家讲到这里。
我来说两句