00:00
在那打开我们的Vs code,我们先找到,我们先找到这个位置啊,同学们,找到server端的processor这个地方肯定要加东西了,对不对?好,先把它写一下,增加一个新的新的一个逻辑case,那就专门画虎呗,粘贴拷贝不就完了吗?说这个套路已经有了message,那这个时候呢,这个消息类型啊,各位同学,那就是SMS。没问题,好,那同样道理,呃,因为你现在要去处理的时候呢,呃,这个这个地方是必须创建新的号,朱老师你这个为什么不能共用呢?废话,你要这个共用的话,你connect不一样啊,服务器端这个是可不能共用啊,同学们你的思路要分析说老师诶你客户端不是写了一个user process就可以了,你服务器端是每一个连接,你不知道是谁张三来了,你是来他能共用吗?因为他的connect不是同一个,所以这这个是每次必须创建一个新的啊你不然的话你你你又蒙圈了,好这地方我们要去创建。
01:01
创建一个SMS process的一个实例,实例完成完成一个什么呢?完成一个转发,转发消息的转发,转发这个群聊消息的一个任务,好,那么开始来做这个事情了,同学们打开它,好,这边一个东西都没写import import里面肯定有些必要的包,对吧?好,然后呢,现在定义一个结构体type。SMS process,好的,然后呢,它是一个结构体,那这个结构体里面有什么东西呢?好一时半会还想不到,应该没啥啊,相当于就是用这个结构体把这些方法管理起来而已。当然你可以直接写,方法也行,但是因为我想还是用这个面向对象的一种思路来做嘛,所以我还是定了一个结构体,只是现在没有用,现在不需要什么字段,以后没准需要了,所以说暂时分析不出来有什么字段。
02:00
暂时不需要啊,不需要字段。为什么他不需要知道呢?因为呃,因为说说说白了,你现在整个整个这个服务器端各个连接你已经在手上了,在user manager里面已经在了,对吧,然后呢,那消息你也能拿得到,那你就不需要了,所以说可以不写好来开始写方法转发啊,直接写方法写方法。方法,转发。转发。转发什么呢?转发这个消息,好的,嗯,那现在我开始写bank,找this share,然后呢是SM process。那这个函数的名字呢?我们叫散散的一个。这个group group group。好,那这地方如果有错误的话呢,就就发没有错误就算了啊好先写到这儿。那你得告诉我,你要发这个消息,你得告诉我你要。
03:02
发什么东西呀,你得给我一个message才可以,那么messages呢,其实在总控这边可以是能够拿得到的,他这边可以,因为他这个message已已经有了,所以说到这个地方,朋友们到这个地方,到这个SMS的时候呢,这个地方消息其实我们是可以拿得到的,只是这个消息呢,你你是要这种message的,还是他已经血液化过后的。那这个我们看看我以前是怎么设计的啊,我应该是直接拿的一个就是message,他就不需要他去处理,我直接自己来处理的,好那也可以,那也可以,我就这样写啊,Message直接也也不让你去反学的话,全部交给我就行了,也好好那就开始写,那就是message.me。好了,同学们,现在你要做的事情是什么?你现在的任务就是要群发,所以说现在的任务是这样子的啊,就是便利。便利。
04:01
便利哪一个呢?便利这个服务器端的。服务器端的这个map就是哪个map呢?是他这个user manager里面维护的这个这个map,对是他便利这个map,然后呢,将信息发送出去,将什么呢?将这个呃消息转发给对转发出去将消息。消息转发。转发出去。好,转发出去。那么这个消息转发出去,咱们得便利了的负循环来一一步一步负循环,嗯,首先得把它先取出来啊取出来。那我就这样写啊,第一个是他的ID,就是用户的ID,第二个呢,就是那个up,就那个up,好,那现在我们这来走一个range,那我要便利的是谁便利的是这一个全局变量的啊,因为它这都在process嘛,那我可以直接用这个变量。
05:06
写错了。粘贴一份啊这个变量。里面的nine us。没问题。On nine users。好便利。那便利的地方呢,呃,当我们遍历一个过后,我们就把它发出去,就s message把它发出去,它所以说我这应该还写一个函数啊,还写一个函数比较好啊,因为你都写到这一块呢,不是特别方便,所以说我再写一个方法fun。This。信号啊信号,然后呢,SMS process。好的,呃,那么这个地方我就写个叫做sand。每一个each啊,每一个online的这个user啊,Send message,对吧,这样写send message to。
06:01
To each,每一个online user这个函数名是有点长,但是呢,无无所谓啊,无所谓,只要信息它比较明确也是可以的,那你得想啊,我把这个消息发出去。我怎么才能发呢?首先这个内容你得给我,你得把这个内容给我,所以说呢,我首先需要你要发送的这个信息内容是什么,就是这个群聊的消息是什么,你得给我一下,那么给我第二个呢,你还得给我一个链接。就是这个连接你得给我一把好,那么连接呢,咱们就可以直接从这拿一个拿一个OK,就是呃,那这方写个C。然后呢,con.net。好的。好。啊,那有这两个东西,我们现在现在这个方法就有了,那就开始这样做了,啊当便利一个,我就这样写了,同学们看。内容还在这里面,还没取出来呢。
07:01
内容都没取出来,你你你没法发。所以说你要先把内容取出来。好,先取出。取出这个message里面的内容,Message的这个内容,Message的内容它是藏在,它是藏在这个里面的,它是藏在MS这个message里面,所以说你还得把它反序列化一下才行啊,因为它的内容藏在这里面的,你你你不去你没没没法弄,所以说呢,我们现在先定一个这样的一个变量。它的类型是message点点什么呢?S啊这个呃,Message。啊,Ms message,好,然后呢,我把它进行一个反序列化,反序列化大家应该都是知道的,那就是jason.on Mar。好,然后呢,我要把反序化,这个内容是哪里呢?是这个message里面的部分。它的代大部分其实现在是个字符串,所以说啊是个字符串。
08:03
呃,所以说我得先把它改成这个切片。是这样子的吧。办学的话。反吸的话,然后这个地方我把这个引用传进去SS,大家看这个没有没有毛病吧。是不是就是message里面一个data部分才是Ms message的字符串,所以先把它反序列化成结构体啊,当然如果有错误的话呢,我们提示一个错误信息。好,如果有错误,我们就提示一个错误信息,写一个if。If,什么A,如果不等于near,不等于near,我们就直接说反虚化失败。扎人。好,简单说一下啊,就揭示反学A。是吧,等于一个L。往后面我们就不走了。好,那现在呢,有办法了啊,现在我取一个,我就这样写了Z点。取出来,因为你便利时取出来了嘛,那么Z是点它的sand to h2,然后这里边呢,我要把这个内容取出来了,现在因为MS里面有有它是有一个内容的,所以说我就直接从他那取出来,它里面的内容是content。
09:18
这个内容content连接在哪里呢?连接在APP里面。用这个链接发东西,Up,点它的connect。好好这样就就可以,但是还有一个问题,这边这样写呢,还有一个问题,这样写会存在一个比较麻烦的事,就说你会把这个内容再重新发回给自己,就你发了一些消息,从服务器里面绕了一圈又回来,又给你自己打回来一个消息,你想想是不是这个道理,因为你这个map里边啊,就是这个online里面,其实你自己也在里面。你你相当于说把这个消息,比如说哈,打出去过后,然后呢,服务器把它那个所在的手机全部转了一圈,发发发发发,把你自己也发进去了,所以说这个地方呢,还有一个问题就是说你你还不能给自己发,所以要把自己过滤掉,这里我们还需要。
10:10
还需要。还需要过滤掉,过滤掉自己就说不要给自己发机,不要,不要再重新发给自己,不要再发给自己。发给自己,那就写个判断嘛,如果你遍历出这个ID等于了谁呢?等于了你这个message里面的那个ID,那么这个这个ID在哪里呢?这个ID在哪里呢?其实这个MS你们看一下这个结构,这个Ms message里面,其实它已经包含了这个传进来的用户ID,大家看这里。是不是有个UR啊,这个user里面其实包含他自己的那个ID,所以说我们完全可以利用这个特点把它过滤掉,那我写一下。找到它啊,同学们,那我就开始顾虑它了。
11:02
呃,在server这边。我过滤一下,如果ID它等于这个MS。第二。他在这个里面有个UID。啊,如果这两个ID相同的话,就说明刚好你遍历出来这个map里面这个人就是自己,那这个时候呢,我们不做处理,Continue。好,钢铁有其他的呢,该怎么做就怎么做就完了啊,该怎么做就怎么做就完了。好,这个是他在进行这个处理的一个逻辑,看看有没有问题啊,Message取出来,把它遍历一下放进去啊,啊便利,呃,把它序列化成一个Ms message。好,然后呢,这个地方根据需求做一个处理。好在这接着往下写,那下面这个地方怎么办呢?因为你已经有内容了,也有这个连接了,那就很简单,你。其实这个地方。
12:02
我们看这是不是有点有点不划算啊,因为你要转发过去。这个内容还不行,不要内容。因为你是把整个这个message相当于转发,那就没有必要再把它打开。没有必要再把它打开。啊,这个有点不划算,因为我们现在又又又又做了一件比较不划算的事情,也不是不划算啊,代码还是该这这么写也是对的,我们这个地方传的不应该是一个info,不应该是个info。呃,不应该是个字符串,而应该就是这个message序列化过后的那个带切片就可以了,大家看是不是这样子道理,因为你,因为我们就是完全不做任何处理的一种转发工作,所以说你其实这个内容对于我们来说没有没有什么实际的价值,只是这个ID对于我们是有有有作用,所以说所以说这个地方呢,其实没有必要传这个,应该传这个东西。
13:02
传一个什么呢?你你通过这个my connect转发的应该是这个message过后的一个序,就序列化的,序列化过后的一个一个一个切片就行了,那应该是这样写,大家看这样子才对。大家看是不是这个道理?BYBYT就是说相当于说这个你发过来消息呢,我把它。呃,序列化,序列化过后,我主要的目的就是看看你到底是谁把自己过滤掉,然后呢,这个message我还原封不动的再给你转发给其他的人,是这意思吧,所以说这个地方我们应该改成这样的东西啊,同学们。应该这样写就可以了,怎么写呢?拿到一个data。拿到一个给他传进去,L等于好,注意听。二等于什么玩意儿呢?哦,原来是杰森点Mar。啊,然后我要把这个message进行一个序列化。
14:02
整个这个序列化啊,序列化,序列化过后,这序列化的时候呢,它是需要是一个结构体,它已经是个结构体了,没没毛病,好,就if如果L不等于内,就说明我们这个呃,序列化有问题,那我还是不继续往下走了,叫杰森序列化master出错。啊,L。等于一个L啊,否则呃,如果出错我就不走了,否则的话把这个直接填进去就行了。大家看看这个逻辑,大家看把这个逻辑捋捋一捋啊,怎么走的,先拿到这个message。把这个Ms ma取出来,取出来的目的,这个家伙取出来的目的主要是在这用了一下。啊,主要在这用一下,但是呢,我们用完了过后,我们真正要发的仍然是这个message的序列化的那个data,因为相当于做转发嘛,我没有落盘,我就直接在内存里面直接读完了,我就通过连接啪扔走了,我也没在中间进行存数据,那这边就你们将来想一想,假设,假设有一个情况,将来你要给某某个人做一个离线留言。
15:15
如果你要做一个离线留言,你就应该去发现有,你就要去扫描所有的ID,你发现有一个人不在线,你就应该把这个消息把它放到一个数据库里面去,然后进入该该该消息是某某某某没有拿到的,等到他上线的时候。你就去读那个数据,说这条消息哪个人还没发过,然后读出来过后再重新扔给他。啊,那就实现一个离线留言了。就在这有有办法啊,那代码就差不多,我就直接写东西了啊,这就简单转发就行了,那就直接是这个创建一个,注意听啊,这就创建一个transfer。Transfer实例发送。发送什么呢?这个data啊,这个单词写错了,叫data啊,好,那就这样写啊,TF总等于。
16:08
U7是这个包里面的一个川石粉。包起来,然后呢,它有个连接,等于什么呢?就是这个声N连过来的,因为是你从这取出来的,从每个map里面那个up啊,就是啊user process里面取出来的,好给他一个,有了它过后呢,不,不用二话写right发出去。Right pkg。把谁发出去,就把这个发出去就可以了,那发出去过后呢,这方可能会有一个L,但也可能没有,我们判断一下。好,If语句,如果A不等于零,不等于零,说明我们这个转发消息失败。你甚至可以把信息单打出来,给谁发消息失败了,转发。转发消息失败了,消息失败。
17:03
那么失败的原因是什么呢?就这原因。好,同学们,这个代码就写完了,其实这段代码比原先要简单。比原先要简单,只是有一点大家需要注意,原先呢,这个连接是直接用来用的,但是现在变了,是我把这个连接通过参数传进去,在这个函数里面反用这个链接去转发。因为这个逻辑跟原先刚好是反过来的,是因为这个我我这里面这个这个我这个SMSM这个process里面是没有连接的,所以说我把它遍历出来过后,把它通过这个参数塞进去,然后这个函数里面我用这个链接再转发出去的,大家看对不对,这这个很重要啊,大家看看是不是有点绕了啊。大家好好想一想那个空间。就是这什么意思呢?如果大家想不起来是这个意思,就是说我在这里面把这个链接一个一个取出来,然后还是用这个链接把这个短消息转发给对应的各个用户啊,各个用户。
18:05
好,应该还是能理解啊,好,最后这写完了,我们来调用它一下,怎么调用呢。就一句话的事儿了。找到我们这个刚才分析的这个主空。现在就差一句话。创建一个实例SM process。等于啊,当然这个地方应该应该这样子,什么呢?呃,创建起来嘛,那就是我们的这个process。二这个包包里面有一个SMS process。包起来里边,因为它这里面没有什么变量要传,所以说呢,实际上就是相当于把它创建一个实例,然后调一下就可以了,怎么调SM process,第二,刚才我们辛辛苦苦写的这个方法叫send group message。啊,Group message OK,到这就完事了。
19:02
把谁给他传进去,把这个消息本身传进去就可以了。啊,我们看这消息,我用的是不是指针啊,我看是不是用的指针啊,呃,都保保持指针,它也是指针,那这边呢,我们最好也把它做成一个指针类型,对做成一个指针类型比较好啊同学们。好,整个我保存一下,看服务器端有没有毛病。看代码有问题我再调调。啊,可能有些参,有些这个包没有引的好,有些包没有引。好,这个地方应该有问题,没有定义messages,好把这些一次性的引过来啊,同学们在这我把这个该要的包,我就一次粘粘一份过来。啊,粘过来过后,哪些地方不需要我再把它去掉就行了,找到它。好,扔过来保存。好,看看有没有什么问题,好,这个没有用到,删掉。Net包没有用到,删掉net包应该用到了。啊对对对对对,Net写反了啊,这写反了叫net点抗。
20:04
第二,OK。好,再保存一把,同学们。好再保存一半过后呢,还有一个错误,看哪里错误啊,他说没有定义这个,那我这少写了个S。好的。好,还有一个错误,Transfer这个没有引入,有TR包没有引进,诶有TR包赢了啊。UT2,他说这个川是少了个S。好,代码咱们就写完了。服务器这段代码就全部写完了啊,同学们。那服务器段写完了过后呢,你还差最后一个步骤,他把这个东西给你返回去了,看看啊,他一定会给你返回去,这个你放心,因为你这已经write了你你返回去过后,你这边不做处理,你仍然是没办法让各个客户端看到别人群发的消息的,也就是说你现在还得做第三一步,在客户端还要增加去处理服务器端转发的这个群发消息。
21:03
但这个群发消息的类型呢,它还叫SSSMS,说这个名字呢,取得有点不太好,有点不太满意,我还叫这个,如果说做的好一点呢,呃,同学们可以给他叫个转发,就比如S什么transfer这样一一类似于这么一个,呃,这么一个消息结构更好。可能他长得很像,但是呢,从名字上不一样呢,从阅读性来说,可读性来说还是比较高的啊,同学们后面可以做一个做一个优化,好,那我现在就不去优化了啊,同学们想一想,你在客户端去处理这个请求的话,是其实是在这个server.go里面去处理的,就那个携程里边。OK,那万里长征很快就要结束了啊,同学们,找到我们这一个可爱的。这个这叫做有。呃,Server server点够在这里呢,我要去增加一个逻辑处理,原先是有人上线了,现在呢,还要增加一个来走。
22:04
Case,那偷个懒啊,Message。我们现在一定会拿到服务器。偷偷给我们传过来的一个消息,就是SMS那个message。这个类型。肯定是有的。相当于说做出中转给我吗?好,这个相当于说有人群发消息了。这个有人。有人群发消息了,群发消息嗯,其实你们可以做很多工作,比如说这个有没有权限发群发消息啊,全部都可以在服务器里面给他打住。甚至发了消息过后回应说,诶群发成功,比如你发个短消息,比如说诶群发你发消息成功了,其实都在服务器那边给你处理了,那这个时候呢。这个地方咱们怎么玩呢?其实相当于说你拿到了一个什么东西,你拿到了一个m msm messages,这个时候你还得要继续的。
23:00
要去把它这个取出来,因为你拿到了,你要把它里面的内容取出来,显示出来嘛,说还要反序列化好反序了,那这个我就直接写了啊,那这我们增加一个方法吧。我在这里增加一个,把这个方法我专门写个叫。SMSMMGRR跟这个对应,你有个urm GR,那我短消息呢也有个SM,呃,MGRR叫管理,这样子呢,思路就更清晰了,来增加一个,同学们不怕多一个文件啊,SM。然后呢,MGR点购好这个地方呢,我的目的是想把它专门用来做管理这个message的啊passage,然后呢,我这写一个process啊,我看他是怎么写的这个名称。好看看他是他也他也叫这个啊,那我就叫这个了。Message pros,好,Import肯定有东西,我就简单一点啊,同学们,我就直接写个函数就行了,叫做什么呢?Output,输出output一个什么呢?群发消息,Group group message能理解,那你我怎么来显示这个消息呢?
24:12
你就这样子,你把那个消息给我,我我来搞定就行了,非常简单,就是你把消息给我,我我来搞定它,对我来搞定它,那老规矩,Message星号me,第2ME好,这个地方就比较简单,没什么返回字显示就可以了啊,显示出来即可,显示即可,那你怎么显示出来呢?首先你得大家都很清楚啊,只要到这来肯定它的类型一定是。一肯定确认啊,同学们一定要确认这个地方来的message一定是什么类型的,一定是SMSMS这个message类型的肯定。为为什么你这么肯定呢?就是因为你在调这个output message的时候,其实他已经在这里给你做了一个判断了,所以你一定可以肯定他一定是这个东西不用不用不用担心,不用担心,好,那现在我就直接写东西了啊。
25:13
那现在我找到这个server啊,不是server找到我们的这个。这好,我就写了啊,先第一步先反序列化。放学的话,反。序列化,反序列化,呃,把这把这个message里面的那个data那部分反序列画出来。啊,那当然肯定是这个东西啦,SMS mes对吧,然后呢,这个MSB点它有个类型叫ms.c type,好写进来,然后呢,反区的话非常简单节省。接点on Mar on Mar,然后呢,这个地方就应该是message里面的这个data部分,大写的data部分,Data部分它现在是个字符串,所以先把它搞成一个切片。
26:05
搞成一个切片包起来。好,然后呢,把它反虚化到我们这定义的SMS这个message可以了,好就拿到了啊拿到了。那么拿到以后呢,你要做一个小判断,看看序列化有没有失败啊,序列化有没有失败,提示一圈啊,OK if error不等于near,不等于near,那么我们就叫反虚的话,SP。啊。S print。Print,好,叫反序列化失败。小失败,就这样写吧。A。L等于它的一个错误信息打出来。点E,好,写完了,这就written return,我不玩了,因为你返需要失败显示不了啊re。这样子啊,这也不一定返回啊,这个返回到返回,但是返回到它调用地方倒也无所谓啊,返回那如果说虚拟化成功呢,就显示,显示的时候咱们可以把内容先取出来,就是人家说的这个内容是什么?Content content内容是什么呢?你这个地方因为已经反虚化成功了嘛,把它的那个内容取出来,就content大家应该知道哦,现在终于取到了。
27:19
那谁对谁说呢?ID你要给我取出来。对不对,所以说那我干脆我就直接做一个串串,大家看我这样写啊,显示信息。显示器我给它格式化一下。啊,显示信息。我格式化一下啊,同学们那就in four。Inform。对于。点printf。我写一句话说用户ID。用户ID等于多少的这个人呢?用户ID比如说斜杠T。这个人他的ID取出来对大家说,对大家说说什么呢。
28:01
好,咱们也来做一个斜杠T,然后呢,把百分S输出来就格式化下,最后啊,这个当最后的这个这个一不就有了吗?有的话我写信首先把它ID取出来,ID其实藏在这里面的。非常简单啊,它就是user ID。这个就是这个发过来消息,这个人发的内容是什么呢?就是MS里边有一个MS点,它里面有个content。把这个格式化以后,我们把它输出来就可以了。好,直接。啥事儿?好,那为了好看呢,呃呃,为了好看呢,我们再输出过后给他来几个换行啊,至少换换一行吧,换一行。好,这里面我要我们要引入一些东西了,引引东西呢也简单,直接从那边复制一份就是通用的就可以了啊来这块可能是大家都他都要用的粘过来。粘过来就行了。
29:01
保存一下,看哪些不需要的去掉好这两个他用不上,用不上拿掉就完了,代码写完了。好,代码写完了,好,Message e,看看。Message is not a type。他说不是一个类型,好。哦,明白哦,这种不需要再写类型了,对,不需要再写类型。好,这边有错误换一行。好,他说这边有什么错误呢,诶他说。这个参数不对啊,参数不对,Print一个两。一个两个好百分S一个两个。啊,OK,这多了一个。好,这边还有一个错误,多一个参数,一个单独的content。SM在看哪里有错误,不能换行吗?
30:03
PRINT。不是打空格吗?哦,Very good,对。好的。好的,因为这个它是P小写的。好,非常好啊。好,同学们,代码就写完了,那现在呢,我们把它调一下,呃,我们调好像还没写吧,我看掉了没有。找到这个server。这边我们差一点意思啊,差一点意思调一下就行了,那调用的时候呢,我们就调用刚才咱们写的这个方法,如果是这种类型,好我们就把这个方法调一下output group message,好把它放在我们这个位置。好放这个位置,然后呢,把这个message给他传进去。把这个Mac啊传进去Mac它本身是指针啊,这边拿到它这边这边呢,转过来的是我看看啊,它反序列化过后。
31:05
哦。他是从哪儿传过来的,看看。它是从这边读到的啊,读到的应该它不是一个指针,我们这边是不是指针,我们看看啊,最好不要让它反复的传递,所以说我这应该是第一个指针,好,第一个指针你这样传的话呢,他可能会报错。报错,我们再加一个艾特符号就可以了,这应该会报一个错误,果然报错了啊,然后呢,加一个艾特补。加艾特就可以了,好同学们到此为止,我们这个代码的就是整个这个群发的代码,咱们就写完了,写完那么下一步呢,我们就来进行一个测试,好先把这个代码的编写先说到这。
我来说两句