00:01
好,进入我们这个re的部分是吧,嗯,Redu的我们的那个action。搜一下。What are?因为我已经打开了,所以哇,所以他收不到是吗?确实确实打开了啊。我就看两边去了,就没看他来啊在这。下面的这一系列操作就比较麻烦啊,我们得一点点想啊一点想,呃,我现在呢要去发消息,发消息就要用到IO了吧,对吧。这个数IO就涉及到前台和后台,是不是都要写啊,先说我们的前台,前台这一边呢,我们得去发消息,但发消息之前先不得把那个IO那个给创建出来啊。
01:14
对不在这个地方啊,回想一下,把我们的刚才的这个test的代码给它打开。说白了,在发之前,我是不是先得做这个事?对吧,甚至在发之前,我们是不是把这个绑定监听的事也要做了,这是固定的呀,前面。是不是先把这个做好。后面是不是才去发消息。真的吧,你这个前面是需要做多遍吗。不需要,是不是做一遍就可以,但这一个是不是有可能做多次的,我每天次发送就一米以下吧,每次发送就一米以下,对不对,就能不懂,好那也就是说我们需要在这个action里面。
02:00
是不是允路这个IO。一问题问题是吧,那引入这个IO以后啊,后面有几个,哎,我的那个太了,把它把其他都关了啊,太多了。我引入它之后,大家看我们后面有一个连接服务器,以及绑定监听,用于接收消息。这个事情啊,也只能做一次。是不是意思,那这个时候我把它啊,大家看到我,我把它封装成一个函数啊,封装成一个函数。我尽量的,我看我写在哪里合适啊,就就写在这,等会我们把我们所有代码都写在这里来这。来看着啊,我封了一个函数,我取一个名字,假设就叫L。各位把这个档案代码什么拿过来。
03:01
有没有看到?好啊。我把我的这个代码,因为翻来翻去的太麻烦了啊,我把这个代码也拿了过来啊,把这个代码拿过来。这在买家包一起看就行。大家看到那我这里面啊,你说我现在去调用一下,他这样合不合适。不合适,为什么?那这样会掉多次啊,对不对,但是呢,我他掉多次,对他掉多次其实不是问题,问题是我每掉一次都会去调用一下这个方法。是不是也就是说啊,我这里面应该做一个限制,在这个方法里面,这个函数内部做限制,你可以调多次,但是呢,我能保证你的说的对象只创建一个。能不能,这怎么办?实际上这里面有个概念叫单立对象啊,啊单立对象什么叫单一对象呢?单一的实例,也就是说我整个内存里面只有我这一个说可以,我这说过的不会产生多个,不会同时存在多个啊,叫单例啊,单一的实例嘛,好如何实现单例呢?其实我这个说回来就是需要四个单立嘛,你不能产生多个,那产生多个的话,到时候我一发送,那就多个人去响应了,不太好。
04:34
这里面有两步去做。创建啊对象之前。我需要去做什么?第二个,创建对象之后也要做点什么。创建对象之前要判断。啊,对象是否已经。什么意思,已经创建对吧,那下面呢。
05:06
只有当什么。不存在,是啊,是否已经在,只有还没有创业啊,没有创业。是不是采取创建,采取创建这个能不懂,能懂吧,这个应该懂啊,判断是否已经创建,是不是就是否已经存在呀,好创建对象之后呢。创建对象之后在干嘛?保存。对象你不保持对象下去,我怎么判断呢?是不是这意思,也就是说我判断对象啊,不用是否换现,就是否已经什么存在可以吧,啊只有什么。不存在。采取干嘛创建,那也就是说,那我创建之后呢。
06:04
保存对象呗,对吧,好。这里面有一个非常重要的问题。对象保存在哪里啊,对吧,所以来说我们的对象是谁呀,Sock。是吧,那这个缩的保存在哪呢。对吧,一般有两种位置一个。函数的Y点,简单说全局对吧。第二个保存在某一个对象里面能懂不好,首先我这个IO应该是唯一的吧,因为我就引了一次嘛,对不对,而且这个IO是不是函数Y部。是不是所有函数都能看得到吧?看的是同一个吧?虽然说它是个函数,但它也是个对象,对不对啊,可以这么做来看着啊。
07:06
我在做之前。我先啊,来一个if判断,刚才不说了吗,第一步。对吧,这不第一步吗?先来一个判断,怎么判断,所以呢,说我们刚才说了,我们就是要把它放到IO里面去点,取个名字就叫说可以加个飞什么意思。不存在,那不存在,我干嘛去?创建了。对吧,那创建完之后呢。这不是我说的我们的第二步吗,是不是?在干嘛,需要保存保存,我直接我就直接这么做得了,来直接写个什么。IO点。可以吧,这没什么问题啊,对不对。
08:03
这个能不能懂,好能懂下面这一个,我该怎么写呢。写什么还有点呗。能不能看懂可以吧。啊,这个是去读,是不是这个才是纯能不能看到好,那也就是说我这个函数即使它掉多变有影响吗。有没有影响?就说白了,我调用多次,会不会创建多个,会不会连接多次。不会吧,因为我有限制嘛,对不对。啊,这个技巧是大家以后工作中经常用到的。是一种通用的做法。好,那有了它以后,那下面我是不是可以通过这个short去发消息。
09:01
我不要发消息吗?我这还没发,我现在只是做了一个初始化对不对。发,谁来发?我下面要发消息啊,我这不能发消息去啊,发消息来发。我是不是要用谁来发short short在哪个里面IO对吧,发消息it。写个名字对不对,我们就叫它什么send message,可以吧,可以好接着了。这个地方不就是把它发过去吗。能看到吧。这样我就会把消息发给谁服务器端对吧,那下面是谁去。那写服务器来收消息啊,对吧,来写服务器切换到我们的serve。
10:03
好,这个时候呢,我们也专门去创建这一次啊,我专门跟他类似创建一个模块。创建一个JS模块啊,去写这个代码啊,我们叫一个名字啊,叫一个名字就叫它socket啊IO_server吧。可以吧,嗯,没问题啊,来这个里面的结构跟这个一样,跟这个跟这个结构还是一样,需要暴露成一个函数。啊,我这个不是写过他来不来啊。拿过来接着呢,我这现在先别来啊,我们这边需要改一改。郑瑞。对吧,得改一下名字。是这个。好,那我这一边啊,写法很多,写法是固定,这个不用变吧,啊不用变,这个呢,也不用变啊,这个也都不用变,好这个要变吗。
11:07
不用吧,啊不用好,先把这一些都给它干掉啊,把这里面的这一些都先干啊干。我们来看一下我这个对是谁呀?还记得不是一个对象,别写对,是个对象,对象里面的蓉什么。谁看?是这个概念吧,那我现在输出的就不应该这是它对不对。能看到吧,能啊能看懂之后,下面我们是要处理数据对吧,最后啊才要去发送啊,向客户端发消息对不对,发消息好先说处理数据,我们该怎么处理。
12:01
我发了一个消息给服务器,你说服务器要怎么做,怎么处理。把它保存起来,对啊,这个处理数据实际上是保存消息对吧?保存消息需要谁呀?需要一个model啊,对不对,那也就是说我们在此需要去引入model对吧?不需要引入model,引入哪个model呢?我们叫chart model对吧。引一下什么。啊,点点斜杠啊,我们的DB下面的modeldus啊,接着我们要想解决结,是不是可以在这里面写个什么解构一下可以吧,可以,那这样的话,我们应该通过他是来最终实现保存对吧?要保存就它不够,不得需要他的什么实力。
13:10
六一个什么它,而这个里面就要传我的数据对象就三个不够啊,大家看一下我们这个地方from to和这个缺这个不用这个默认直接或缺谁chart笑话ID和谁看,那也就是说在这之前。我得先什么准备一下数据吧,有在我的保存啊处理之前先是准备啊消息对象对吧?啊叫消息对象,我们叫他洽谈买对象,真不里面啊对象。的,呃,相关数据还有两个啊,需要的一个叫下划线ID,还一个叫什么呢?Create下划线看。
14:12
这个好整,这个先整了,这个先整啊,Date减到。就可以了,是不是好,关键是这个恰下划线ID,我说一下我们的格式是什么格式。啊,是from_to,或者也有可能是什么呢?To_from。啊,为什么不是固定的说from叫to了啊,我们说过一个事情就是啊,假设这是from,这是to是吧?啊,那你光就是from to。如果你固定的格式,那不行,因为固定格式,那下面我是另外一种方式呢,那你就不对了。是不是我希望这两种方式的结果都一样,这个该怎么办呢?啊,也就说普图我都有,我要拼一个串对吧,但是又能保证啊,对啊,又能保证,无论啊from和to,他们俩换一个位置也是一样的结果。
15:17
刚才有个同学说了一个非常重要的一句话,叫排序。对吧,大家想这个from to啊,无论是它们相互之间换来换去没关系,排序以后结果都一样,可能是from to,也可能是什么to from,但是一旦确定好了以后会变吗?不会变,你想嘛,我的ID假设是,我的ID假设是ABC,它的ID假设是呃,Cab是吧,排序以后假设啊,排序以后的结果是ABCCB,就这样一个结果,这个结果会因为八的方向相反的话,会变化吗?不会啊,这个是没有关系的,因为两个字符串排序的结果是固定的,对不懂,懂不懂,也就是说from假设是ABC,或者说from是cab,我的结果应该什么要一样。
16:11
怎么样保证他们一样,对不对啊,这是个技巧,就是对我这个东西,我也不管你们啊,是谁是谁啊,我就在看到这里啊。来一个from like two。能不能懂啊,OK,好,接着做一个非常重要的事情,调用的方法。排序一些默认排序的方式,就按字母排序嘛,那么呢,排完序以后再去什么呢。Join。下划线,因为刚刚说过了,是是这个。再一个。对吧。能不能看懂,那也就说到现在为止,我们需要的五个数据是不是都准备好了。
17:02
懂下面呢,传进去指定我的什么下下划线ID指定我的,亏得这里面就要说一个是这个属性名,这个变量名千万不要写差了。对吧,一定要跟我们这里面名字要什么要一致。不然的话,根本保存不好对应的位置。能不能接着去调用什么去。See。是吧,啊C5这个地方来有一个什么毁掉函数,能不能这里是什么I和。说保存产生的一个新的,我们叫它chat,什么message。而这一个message是不是最终就需要去发给?
18:03
可不。对吧,好,这里面要说一个事情啊,这里面说一个事,向客户端发数据好向客户端向哪个客户端发呢。首先我们有一个我我是一个客户端,还有一个是目标,要不要向目标发,目标肯定要发,那必然要发对不对,关键是啊,关键是有一个问题啊,关键问题什么问题呢?我我要不要发。你说老师我哪样发了?我不有from to和content,但是你要知道我的那边缺乏ID,没有下划线D。没有恰下ID,没有create time啊,这个恰的下ID倒没什么,主要是那个下划线ID和那个create time没有。
19:00
对吧,这个其实尤其是下回ID,也就说白了,我说我的发送完,我是个发送的人嘛,不我发的消息吗?啊,我发的消息。按一下我在我的客户端,如果他不给我发不够,我去把这个发给我,那我告诉你我的那个那个ma根本就ID都没有,没ID是很危险的。那么呢,所以他需要向我发啊,还需要去向目标发,但是其实也不一定要向目标发,有一种情况,目标他一定在线吗。我跟人聊天是吧,他一定在线吗?他没在线,你给他发啥呀爸。你说老师要不发那怎么办?不发你现在发也没用啊,他收不到啊,他都没连上来对不对啊,那就说老师他要他没连上呢,我又没嫌他发。那这个事情,那他怎么得到数据了。
20:04
他能不能看到我发的消息?能不能我不存在库里面,我存在库里面就是为了给他看的呀,对不对,他到时候自动会查呀。也就是说,我一定会向他发吗?发消息,这个不一定。得看他有没有什么,有没有连,他要没连那我也发不了。这能不能懂啊,那我现在我说的一个问题大家看啊,你说我现在就去调用一个socket,点一米去发行不行。啊,大家想想我就要啊,我那时候就叫receive message啊,把这个恰message给他什么呢?发过去,这是吗?这样这样大家看到啊,那这个时候啊,这个时候只是啊记住了。
21:01
看这里只是给我发了一下。这不行。这样肯定不行的,这个地方啊,按说来说有可能是不是还要给目标来发呀。能懂不?那这个时候怎么办呢?目标我也不知道,目标我哪知道那目标的收费的是谁啊,我哪知道这个地方啊,我为了简化,其实啊可以做到给目标发的,但是我这里面做一个简化,咔嚓一下,我管你了。什么意思?向所有连接的客户端去发。其实这样啊,这样做其实效率不算特别高啊,就相当于啊,所有所连接我发这个消息出去了以后就咔嚓呼器,就像所有人都发了,都会发消息啊,所有年纪的人啊,所有年纪的人都会发消息。这样其实好嘛,不算是特别友好,对不对,虽然说我们可以通过程序来屏蔽,不让它显示。
22:07
但是说实话还是不那么好的,因为跟他一点关系没有,比如说我跟你啊,我跟你的聊天是吧,啊,你还不在线呢啊,我我在线我给你发,我也不知道你在不在线,我就发呀,发了以后服务器收到以后,咔咔咔,不管三加七,冲着全局全局去发送那个消息啊,那这种感觉就是你的你不在线当然收不到是吧,别的在线的人,无关紧要的人,甚至我的仇人都收到了这个消息。啊,其实这个不算特别友好,不算特别的高效,但是呢,比较简单。啊比较简单,这个版本呢,我们就先展示,就做这个相对简单的版本啊,就上所有连接的啊,连接上的什么客户端发消息,那这个里面。就必然帮帮我吧。
23:00
对不对,自然是不是也包含这个目标客户。对不,那前提是目标用户连接了,他没连他也他也不用说。这个能不能懂啊,这个能不懂啊,这个这种做法就要有一个事情要做。当我浏览器端收到消息后。哎,我得确认一下是不是我。是不是我发的或者是发给我的。有可能是跟我一点关系没有。那个数据要显示吗。不用对不对,听懂吧,也就是说跟我没有关系的消息,我也会收到,我的浏览器端会收到的,但是不能显示。对吧,因为我们现在是种简单的处理方式。这个要注意。好。来,那我这个发消息啊,我全局的发消息啊,那我的客户端回到我的客户端这边。
24:00
我是不是写了一个on?对不?On是不是写了一个receive message刚好与他的这个名字是吗?是匹配,他发的是个恰message吧?那我收到的date就应该是什么message,那我应该把这个message什么输出?能不能,那现在也就是说我们应该整个发消息收消息的流程走通了,对吧,那我们现在再去发一个消息看一看看看啊。能不能收到啊来。嗯,写完了啊,客户端啊,客户端向服务器。发消息发的消息内容啊好来试一下啊,试一下呗,啊试一下先啊,把它清除一下啊,刷一下还是来啊。
25:05
来啊啊AAA。接着走,你好,我把那个我把那个注意一下啊,嗯,这这个哥们有影响,嗯,打印太多了,不太好,就是把那个注意一下,把这个把这个注意一下,那我那那个我没有,我那个已经已经被就这一个。嗯。这个给大家稍微注意一下,就这个别用它了是吧?啊,太被告了啊,这样太多了,不太好来再来发一次啊啊ABC发送,诶来了是什么?首先说客户端向服务器发消息,发内容是这个吧,这是什么?客户端收到服务器发送的消息看到。是不是我们那个message。是的吧,是的,没问题啊。
26:02
能不能看到啊看到。而且啊,这一这一整的话,按出来说,数据库里面是不是就应该存了我的一个数据。看一下。数据库里面。诶,多了一个什么恰。查看一下。剩两条了啊,我刚才发了两次吧,我发了两个。啊,先发了三个A,接着后来发的ABC。能看到吧,好。可以吧,可以啊,没有任何问题。好,那有人可能就说老师啊,我们现在应该用两个用户来测一测,有意思,要有两个用户测才能说明真正的问题,什么意思,大家看啊。我现在不是去给AA去发吗。是吧?
27:01
能看到吧,啊,我是去给AA去发好这个AA我随便写的什么,我看一下我看一下啊。我得看一下我当前的这个chart搜一下差啊。亲,我这个A是我随便写的。也就是说我们现在没关系啊,等会我们来看一下,我当前是当前那个进入的用户是谁,我是可以知道的,没关系。老板一是吧,等会我们再看啊,我们现在是给老板一发消息,对不对,好,现在我就用什么,你说我应该怎么做。用老板一来的路对不对。这个能不弄啊啊来我们是3001是吧,诶这个前面还不显示LOCALHO3001。
28:00
诶。是不是3001吗?我写了3万呢。真写的3万啊好,那我先什么登录什么。啊,老板是吧,一是吧,接着呢,啊登录一下123。这里是吧,现在我们是不是要去打开我的控制台,去看一下那个它的一个打印输出,到时候。能懂不好,来试一下啊。来试一下abcd总理来看一下。完蛋。什么意思,没有没有输出啊,对吧。能看到吧,因为我们现在我们现在后台大家看一下后台啊,看下后台,嗯,刷新一下我这地方,诶啊不对,刷新这里啊,查询一下是不是有流量,而且我们现在用的我们so端,大家看到我们用的是IO点什么。
29:14
是不是一米对吧。能不能好,这里面有一个事情啊,有一个有一个非常重要的事情,有一个什么事情呢?这里面有一个问题,有一个这样的问题,大家看到我们这个action啊,Action上面诶。浏览器端应用啊,Action,我们action是这个啊,我们有一个in是在什么时候才去调用的。对,发消息的时候主要是这个不对,这个这个整个我要发消息那个这边就没有注册监听,对啊,我这个没有注册监听。
30:01
能不懂没关系,没关系啊,我捞到一个人,我就随便发一下,我就注册上了,等我我那我来发,我来给他发吧,我来发啊,大家看到我来发啊,我来发他也能收到,我随便给别人发他都能收到,试一试ABCDEFDEF走你。自己有了吧,首先自由了来,接着需要看一下什么呢。大家看呢,不是刚才写的是什么内容,ABCDEF。能不能看到是有了,那也就是说从中我们发现一个是我们那个1IO做的时机不太对,是不是这意思,做的时机不太对,那后面我们会说一下在什么时机做啊,现在至少我们的这个整个是通了的,对不对?通了没有什么太大问题吧,没有。啊,终于能发消息了,但实际上没显示啊,这个显示他又要一段时间啊,先先先停一下吧,啊,太不容易。
我来说两句