00:00
下一个话题呢,我们来写一下阿卡的网络编程,前面我们讲的没有涉及到网络,没有涉及到网络,那么它的复杂度是比较低的,而且实际上价值也不高。你想一想,两个都在本地,你跑来跑去的有干啥呢,对吧,没有意义,或者说用处不是特别大,我们更多的这个情况是这样子的,就是更多的情况是这有server,这有客户端,他们是在不同的机器上的。啊,这个才是一个常态。因为你服务器集群你都跑在一个机器上,那X它的性能也会有降低,所以说我们来看看更多的一个情况,就是网络编程,那首先呢,我们来说一下这个案例的需求,需求特别简单哈,同学们,它是这样子的,服务器,服务器端要进行一个监听,那么姑且我们认为是在这个端口吧。啊,服务器假设是在999端口监听啊,千万不要再写一个九,再写一个九,没有这个端口啊老师我写一个端口最多只有665535哈,不要写错了,在这个端口上监听,或者是在这个监口监听,监听好,那么这个地方监听以后呢,这个客户端可以通过这个键盘输入发送咨询问题给这个小黄鸡客服啊,像自动机器人一样啊,Rap机器人,那么小黄鸡它呢,可以回答客户的问题,但是是有选择的,比如说我们可以通过关键字,比如他说了有学费,我们就按学费回复,你看我这写的是这样几个问题啊,我们就先定时,比如说客户。
01:36
这个这个客户咨询的问题是大数据学费是多少,我们可以回复大数据学费是一呃15000,呃学校的地址在哪里呢?我们说是在北京昌平某某路对吧,他们说诶这个假设出了一个瓦特,我在服务器端我不能识别,我就说你说啥子对吧,你说啥子不知道,他说你你们这可以学什么技术,我们说大数据前端等等,那么这地方我们既可以精准匹配,我们也可以模糊匹配。
02:04
比如说我发现他只要有学费,诶我们就可以再进下一步给他恢复你做的智能一点,他有个小功能就发现学费,我就你去你问的是什么学费,对吧?我我先检索一下我本地这个有没有这个精准匹配的,如果精准匹配,我这个小黄鸡就回复一句话说你你想你想咨询哪一个学费。因为我可以做一个很简单的一个算法嘛。对,这个用一个很简单算法,然后那边就会回复,诶,我要大数据,我的如果我的关键词有大数据,有学费,我就把这个信息给发回去,这个可以做的很智能,但是你们不用去研究啊,因为这个是另外一个话题,那叫语义和词法分析,这个是谁来研究的呢?这个就是那种百度干百度那些那些人同学们以前学过,像学Java意义的同学就会像会去个鲁啊,或者学的学pap的就会学那个斯芬克斯啊,他会会叫迅搜,这些是专门解决这个这个对话搜索的,每一个就说在我们计算机领域,每一个话题展开都是一个,都是一个学科,比如安全,有专门研究安全的,有网络研究网络的,你们将来在公司里面,你们究知道是这样子的啊,其实我们,呃,程序员将来在一定程度上就研究一小块,你你都研究不了那么多太多了东西哦,这个it行业很大很大,好的,那么这个需求我就写说清楚了,就是一个是需求,一个是界面,大家。
03:29
也大致知道了。好的,那么现在有了这个东西呢,这个网络拓扑图我们简单画一下,待会我们是怎么做的啊,各位朋友,那待会儿呢,我我会有一个服务器这边会跑一段代码啊,我先把这个说清楚,服务器这个服务器上面说白了就是跑了一个actor,跑了一个actor。就是这面它有个actor在运行等待啊,那么这个这个地方呢,我就帮他跑到127.0.1,然后是999这个999这个端口啊,前提是这样子的,他在这跑着,他在这监听,那么这个监听完了以后呢,我们将来可以有很多的客服。
04:09
就有很多客户有这有个客户,这个客户呢,我们取给他取个名字叫custom actor,好待会呢,就是custom act actor,那这个actor呢,这个地方我们也会指定它的一个,呃,一个这个这个这个他的一个地址,比如说这个端口呢,我们给他取个叫999。酒吧。哎,这个地方就就就涉及到在阿卡的时候呢,它是需要你的客户端,就是你的客户端也也要指定一个IP地址和一个端口,这样他们之间呢,就通这个端口进行一个通讯,就是我发一个消息给你,对我发一个消息给你。然后呢?我发一个消息给你,然后你拿到这个消息以后呢,你可以给我回复,我说诶拿到这个消息了回复,但是前提呢,这个地方就是同学们要考虑就是呃,这个地方他要指定这个端口,就一一一来一回一来一回,那除了这一个客户呢,我们还可以有多个客户。
05:12
当然这个多个客户,如果你在,如果说啊同学们,如果你这个客两个客户在,在同一台机器上,你这个端口就不能用了,因为这边已经用了9998,但是如果不在同一台机器上,比如说这是韩老师的电脑,这是。我们班长的电脑,那班长仍然可以用9998,因为我的端口是每台电脑是有自己的一个端口的,所以说大家不要认为我这用了9998,别人就用不了,是还要看是在不同的机器上啊,如果说不同的机器咱们就可以用啊,不同电脑可以用。啊,我们写个不同的电脑,如果你是同一个电脑,如果你是同一个电脑呢,那对不起,对吧,那你就必须,呃,你你就必须换端口了,你就假设这样,你会演示一个9997啊这样来玩,那同样一样可以进行这个通讯。
06:04
好,这是它的一个简单的一个示意图,那下面呢,我们要开始来说一下怎么写代码了,诶同学们,呃,今天这个代码呢,代码量比较大,呃,但是我们一步一步去写,都是很轻松掌握的,我的要求很简单,就是你要做到一个什么水平呢?就是拿到这个代码过后,立马自己就能写。啊,不是不是说我还看半天,因为我们将来这个作为刚刚入刚刚入行的程序员,你就是一个能力,就是就是熟练,现在现在的老板他为什么要招,要招要招这个工作一段时间的人,他喜欢工作一段时间,其实很简单,就是这是个熟练工。比如说我,我同样给你1万块钱,给张三1万块钱,给你1万块钱,那么张三呢,他做做过三年,我把这个任务交给你过后,可能这个这个哥们三天就做完了。啊,我给的是1万块钱,那么假如我再招一个人,他是没有太多工作经验,他也能做,但是呢,他要多少天呢,他得要一周啊,那我一说老板一说妈四周四天多了,四天我的我的工资一样的,这就是老板,老板他是希望。
07:12
你熟练还快,这就是他们的心态。当然这样老板也是很合理的,很合理的一个想法,对吧?啊,不像中国的企业呢,不像国外企业,国外企业呢,它是一般是诶可以先投,先去投入一些,慢慢见回校,中国的老板呢,大部分啊,我只能说大部分一般是我花了一块钱,我就要听到一块钱的一个回应。啊,你看像为什么?呃,在目前整个这个it界,包括计算机这个界,中国几乎都没有原创的东西了,操作系统全是老外的,语言全是老外的,核心技术全是老外的,为什么不是中国人不行。不是中国人不行,我我认为不是中国人不行啊,其实中国人可以搞很多都出来,你比如说中国就搞了一个红旗0NUX是嘛,对吧,这个不算,但是为什么呢?因为中国人太累了,中国人没有太多时间去做,你看老外,像那个北欧国家啊,我也我我有以前一个大学一个同学,那哥们移民,他先去到美国,后面他说他说老韩在,在美国他妈没意思,到哪去呢?到北欧,北欧像那个挪威,瑞典,瑞士这些地方待遇特别好,那边号称是从摇篮到坟墓,听过吗?
08:22
什么叫从摇篮到从小,从你生下来到你死,国家都管啊,就生病了不用担心国家管,没吃的了不用,不用担心你没,你没有工作了不用担心有有有补助,而且没有工作的人比有工作的人过得更潇洒啊,开玩笑呢,你别有一真是真是这样子的,因为他那个福利待遇特别好,就是那些工作就是什么,有些待遇好的国家,他工作就是很轻,这样子就造成很多情况,就说我们如果不为了生活,不为压力,我们就可以做一些自己想做的事情,你在中国行吗?你没办法,你天天老板催着你赶紧做工作,那么他他国外些外linu是Linux系统原创,这些都是这些国家过来的,那为什么呢?不是中国人不行,而中国人太累了,你看像我像韩老师这样子,每天回去,每天回去第一件事情就是明天讲什么课,是吧。
09:15
然后像刚刚讲完这个SC过后,下面又一个任务又来了,又又开始新的课程研发,没有原没有没有原创的动力,对吧,你想你想去写个操作系统啊,也没人推广,因为占领,所以说这样就会造成一个什么可怕的现象呢,就是差距会越来越大啊,以后这个振兴中国的软件事业就交给你们了啊,交给你们啊没办法,好,这是我们的一个网络拓扑,那下载呢,我们就直接写代码了,好写代码呢,我们是这样子啊,还是一个简单的规矩,我们写代码之前呢,老师写一个简单的框架。为什么呢?因为写个东西引导我们好,同学们,我把这个小的一个框架呢,先写出来,就说我要怎么做。好朋友们,现在我们开始写这个小框架代码,虽然很简单,但是我还是要写,原因很简单,就是要引起大家将来这个思路的清晰,好,首先呢,我先写服务器端啊,为什么先写服务器端呢?因为服务器肯定是先运行。
10:19
对不对,好,这个线服务器,服务器端注意听啊,就是看老师是怎么一步一步写出来的,还很轻松啊,服务器端呢,我们,呃,当然也有术语叫R,没问题,那server我怎么写呢?我怎么写呢?首先我这里有一块代码。大家看清晰了,这块有块代码当然在这里呢,我会这这相当于是我们的服务器的一个主程序。主程序,这个主程序要完成的事情,大家都很清晰的知道,首先呢,它要创建我们的这个I system,这样子一看就特别的清晰。他要创建自己action,当然他也要去创建我们这个服务器的server,那么服务器我就直接叫取个名字了啊,这个我直接叫一个名字,这地方它要创建什么呢?创建这个小黄鸡的一个actor,创建小黄鸡。
11:17
小黄鸡的,我给直接取名字了,取名字我就叫yellow。啊,同学们看这个是怎么分析的啊,Yellow这个chicken谁是in,然后yellow请sir好,我就给它取个名字,就叫就叫叫这个名字我要创建它,那创建它以后呢,同学们你得让他监听对不对。你不监听,人家怎么连你呢?人家怎么连你呢?所以说这个时候我就会在这个主创里面启动,启动启动我们这个yellow server,这个actor,这一点对我来说非常重要,你不启动人家无法监听。那这个启动这个事儿,那么在哪里监听呢?待会我们就会写这个东西,让他让他跑起来哦,让他让他让他监听起来监听,因为你不监听我没法连你嘛,显然这个时候启动它的代码肯定跟原先是不太一样的,也就是说这个候创建这个挨个肯定有配置信息在里面。
12:18
好,这是我们说的第一个信息,那么他在这个地方做的时候,那下面呢,应该有一段代码来支撑它的这个运行,那所以说我还有这地方还有另外一段代码,就是什么呢?这个actor就是我们说的yellow。好,Yellow,这个chicken chicken,这是I,这是in,这个呢是个sir,我呢,他这是一个actor,看清楚了,这是一个actor,这个actor里面大家都知道,他有个核心的方法,他有个核心方法就是receive,这个receive呢,他也会做很多事情,Receive这个方法。这个方法里边呢,我们肯定要做几件事情,第一件他可以啊输出,它可以输出一句话就说我开始工作了,输出大。
13:10
就开始表示输出,失大表示开始运行。哎,表示开始运行。对吧,那么这个事情做完以后呢,他还有很多任务要做,比如说他必须完成一个什么任务呢?比如说他要可以接收消息。他可以接收客户发送的消息。发送的消息,这就有问题了,发送消息很多,你怎么区分他发的是哪个消息呢?肯定要用到我们的偏函数。啊,那当然就没了,好,他接收消息过后呢,他要回复消息给我们的客户端,回复消息好大体就是一个基本流程,基本流程那么作为我们的客客户端他要做什么工作呢?来我们继续分析这边的代码。对不对,那么这有个客户端,客户端,这客户端呢,我们叫做customer,比如我就叫customer act。
14:05
OK customer actor,那么这里面呢,它仍然也有一个主程序,这是跑不了的,它这个主程序它要创建我们的actor system,他要创建什么呢?客户端,客户的actor。这是肯定的,他要创建客户。客户actor,那么客户actor我们就取个名字,这里面的,这里面的难度稍微大一点啊,取个名字我们就直接叫这样一个名字啊,叫卡特什么玩意呢?Actor没毛病,那这里面呢,我要启动,我也要启动我的customer actor没没问题吧,Customer actor肯定的。那么启动以后呢?这里面最大的问题就是这个actor,它必须要持有服务器的引用。你不能发不过去。你不能发过去,所以说这个地方创建这个customer actor肯定要要有得到一种我要在一种方式拿到yellow checking CR的这个引用,其实这个就叫actor pass。
15:11
这个就X pass就引在这了,所以这些地方呢,会有一个非常重要的地方,就是这里,就是在创建这个地方时必须。必须持有。他必须得到,得到什么呢?Yellow大家看这个就看的非常之清晰,Checking就是就是I这个yellow checking这个server的这个ior的引用,因为它是actor吗,它的引用,你只有拿到这个引用,我才能最后往这个地方去发东西。好,这就是他的核心,然后呢,这边它肯定还有一个actor。啊,这边肯定有个actor,那么我们姑且这样写,取个名字吧,就叫卡。
16:00
他是tor actor,那么这个actor要做什么事情呢?第一个他肯定也可以输出,一句话说我开始开始运行了,输出十大,表示我这个客户端已经可以发送咨询问题了,表示客户端可以发送咨询咨询的问题了,这是第一个,第二个他肯定可以发消息发问题,你看我们这儿不是说可以让他发这样消息嘛,说诶大数据多少钱。学校地址多少钱?What,我们可以觉得这是这个地方,他可以发送问题,发送这个咨询问题给谁呢?给我们的这个小黄鸡的这个。OK,那他凭什么拿到呢?因为我在创建这个艾时候,我就已经把这个艾克传过去了,这个地方是需要同学们想一个办法的,待会我要讲好,当然他发送消息以后呢,他也应该有一个能力,干什么呢?接收这个消息,接收谁的消息呢?接受这边服务器这个小黄鸡,这个艾克尔给我们回复的,他们通信肯定是艾克和跟艾克之间的一种交互啊,接受消息,那么这样的流程呢,就画的再具体一点,这个信息就更清晰了,怎么画呢了了啊,同学们。
17:18
你可以这样理解。我这样稍微再往这边挪一下,这就更清楚了,好,你要学东西,你这样去学,放心好了,代码绝对不会写乱。不会旋转,那你可以认为什么呢?我的这个艾会有一个邮箱。这个邮箱我在前面已然说过。同样这个哥们呢,也有一块油箱好看清楚了。看清楚,那么这个邮箱是谁的邮箱,是我客户端的艾克的邮箱。Mailbox。Mailbox同样了,你这个yellow这段呢,它也有一个可爱的邮箱,我们叫mailbox,那邮箱发送的时候我是怎么发的呢?非常的简单,我是这样玩的。
18:08
我这边发送咨询问题的时候,噌的一下我就发到这边来了。我为什么能发到这边呢?因为我持有你的引用,至于这个引用怎么发,那是另外一事,然后你这边这个呢,就从这边去抓东西。这是前面已然讲过这个逻辑,好画这个线吗?抓东西他就抓到,抓到东西他要回复消息怎么办呢?这个地方他在回复的时候,显然他是可以用深来解决的。对不对,Sender,那这个时候他在回复消息的时候,噌的一下发到对方的邮箱。诶,好玩。要发过来,发过来过后呢,这边我们这个这个当然这边我这讲的就是receive方法啊,这个地方应该有个receive方法,我忘写了CE。CE,好,这个receive方法呢,它会定点的,就这个mailbox啊,我这应该这个线写的有点问题啊,最好这样写,因为我一直都是这样写的,干脆我们是要按这种推送的方式去推,比较好好看一点。
19:12
啊,推给他,那同样这边拿到消息过后呢,Mail box呢,会把这个消息推送给你,你不是接收消息吗?我推给你就完事了,好,同学们大体的一个流程就是这样子,那你要做的事情就很简单,按照这个顺序一步一步完成,好,这就是我们画的一个简易的程序框架图,包括我们前面的一个分析就说完了,下面就是写代码。啊,只要你用这个图做一个引导,你怎么写都不会乱啊,怎么写都不会乱,好同学们,关于这个分析呢,老师先截段,截取一段视频。
我来说两句