00:00
好各位,我们接着刚才写的代码呢,继续往下写,刚才我们这个地方监听已经OK对不对,那下面呢,我们应该回头来写这个客户端了,有写写代码的时候呢,有可能出现这样一个情况,就是相对于写这个TCP编程啊,你有可能这样写的就是呃,写了一段这个服务器代码,然后呢,写客户端代码进行一个测试。啊,然后再写客户服务器端代码呢,再写客户端进行测试,可能是这样一个开发模式,啊,可能是这样一个开发模式,当然了,有同学说老师那假设这个服务器端和客户端不是同一个人写,怎么办呢?那没办法了,那你就只能是呃,自己写一个模拟程序,你也不可能完全不测,因为服务器代码很多,他必须要依赖于客户端去测试你成没成功,所以说这个地方就是开发的难度肯定要比开发单机版要要要难一点,对不对,好,那现在呢,我们老规矩写一个client server。真正思路C。烟顶购,那么这个时候呢,我们来走客户端package主包包。
01:05
OK import老规矩,既既然你是做这个东西,那你肯定form ma包到时要输出点东西嘛,然后呢,Ne包跑不了,这两个包是最核心的,好,这就不多说了,Fun主函数一样的走,那首先这段代码我们来考虑一下,就是你上来过后先需要给它连接,那你连接得有一个专门的函数,对吧?所以说我们来查这个手册,我们发现这个函数里面有个特别重要的函数叫什么呢?对。来看这里对调一下啊,往上找一找啊同学们手册呢,我带大家看里面有个函数,来看到这里,哎,不是这啊往下走。呃,我搜一下。TAL。好,往下走。挖走啊挖走。
02:00
好,这这个不是,这个也不是,这个也不是,哎,过了吗。那TCP也不是,它就是单独的一个de啊,还不知道这还不在这啊,它可能是已经在上面在上面好,大家看这里这里这个函数。啊,这个函数呢,大家可以看到啊,呃,它是这样子,Net点亮里面写上TCP,这边写上你要连接的就是对方的那一个服务器的,服务器的IP加他的端口,注意听一定是服务器的IP加端口啊为什么这样说,其实前面我讲的很清楚了,因为一个程序它一定是IP加端口,才能区分你是跟哪个IP进行一个沟通的,你不能光写个IP地址,那这个IP地址上面有。可以跑几几万个程序呢,你知道找哪个吗?好,最后地方它会返回一个connect,这就是这个连接,这两个连接就是对上了,就你的链接和我链接是对上的,就跟打电话一样啊,这个链接你说的话他能听到,而这可以做一个做一个L,就如果他不会空,你可你可以看到,就是处理这个L,然后呢,如果成功的话呢,你可以做你的其他的工作啊,大家看这里有点意思啊,他就写个八份io.new reader。
03:14
大家知道想干什么吗?他想去创建一个reader,这个reader呢,他可以接收这个键盘的输入。就是这么有意思,就是可以一一就就是可以一行行说,我们以前那个是一个字符,一字太慢了,所以说这个地方又给我们提示一个reader,可以去指定一个连接,看到没有它连接,当然也可以从键盘啊,很有意思,好,现在我们开始写代码。写这边的代码了啊,注意听讲,所以你看这个图多重要,如果我没这个图的话,可能老师描述起来很难,我可能说哎,这个那个是吧,那中国人喜欢这个那个是描述特别不准确的,好来吧。那现在我们开始走一段代码,这个是应该是net.di。对,然后呢,首先我说的还是TCP协议,你不是TCP,我也是TCP,然后呢,我要连接到IP,因为这个IP呢,因为我在本地,所以说我就这样写127.0.0.1,那么准确的写呢,呃,这样写法应该更好啊,就说呃,如果说想做到这个兼容性的话呢,其实我也可以这样点。
04:24
是不是是不是也可以这样连啊,就你们要连的话呢,就这样连。啊,其实我这样也可以,那这个IP地址呢,后面我们要把它做活。要写成一个configgu.ini就是读那个文件,你不能写到程序员写死了,那写死的话,每个客户机,每每个客户间它不一定一样啊,它可能还变化呀,所以说这地方呢,最好从服中级动配置文件里面读取,好好这个我写到这里,然后呢,各位朋友,然后写成8888。8888叭,所以这句话的意思就是说,我要去连这个服务器上面的888端口的一个监听程序,那最后他返回一个什么玩意呢?首先这个连接拿到对不对,还有一个L。
05:06
OK。好,各位朋友,那我肯定要做一个判断,如果A不等于,那就说明我们连接成功了嘛,那就提示啊失败了啊失败了,我把这个错误信息打出来,如果失败了,我们错误错误信息,这叫there。就这个项叫叫叫这个C口端的一个这函数失败。L等于啊,等于什么轴星星原因给你打出来,但如果你连都连不上,这个地方肯定要。你自己跟人家连不上,你还你你还干啥,啥事都没干了啊,如果成功的话呢,我们打印出一句话。好,这个connect啊,这这个con,它是一个接口,里面有大量的函数,有大量的方法,大量的方法啊好,我就写一句话叫做connect等成功啊成功,那么我们把这个拿出来看一下。
06:00
再打出来看一下CN。嗯,好,各位朋友,我们看看有没有连上啊,有没有连上走。走啊,现在呢,这样子啊,服务器不能关闭,服务器不能关闭,它在等待连接,所以说我们要新开一个。我们要新建一个啊,就是从这边去连。好,现在呢,我进到这个目录下面去啊,这个太慢了,我就直接从这切切进去啊。要一级一级的找,太累了。我来找一下GOSRC下面有个go code下面有一个刚才写的幺八下面的。这个TCPDEMO啊,OK server对不对,然后呢,来啊说错找错地方了啊。应该是client,是client吧,CLIENT3D进到这里面去。好,各位朋友,那现在呢,我们来看看他有没有连上。主要看这句话哈。如果我连上的话呢,它这边应该会提示等待扣链接,这个要闪一下。
07:03
Go run client中。好闪了一下成功了,那你可把他IP地址打出来,就你可以得到对方的IP地址,看我连成成功了。那如果说说好老师,我想在服务器知道是哪一个客户能连到我这行不行呢?当然可以说老师我就想看一下,没问题,没问题,我可以把他IP地址给打出来,那你就在server这边,你可以把它的IP地址怎么得到呢?通过这个con con在服务器端这个con拿到啊,啊,那这种我可以把它打出来看一下。叫对方的IP就是客户端的啊,客户端IP等于多少呢。这样子啊,客户端。客户端IP注意听啊,那这边我们拿到它的一个位置,那怎么取呢?这个CN,虽然它有一个它有一个方法对吧,这个方法大家还有还还有印象还有印象。
08:02
我要找找一个这个。诶,找一个啊。这个地方,刚才我们是在这儿找到一个。对。找进去,它有一个方法叫做remove address这个地方它返回的是一个ad,这个ADDDD是个什么玩意啊,先把这个先粘过来说。我们先把这个放过来说,看它是是一个字符串还是什么东西。好,可能是个结构体对吧。可可能是个结构体,可能也也可能是个接口,我们点进去看一下这个是什么玩意儿,点进去。哦,大家可以看到,呃,它是一个接口,有又是一个接口,它实现那个接口,那么调它这个实寸是不是就可以拿到字符串格式的地址啊,是不是转它一下就点什么呀,点时寸。这样呢,我就可以拿到到底是哪一个客户端连到我的,那么我们来看一下。我再重新连一次。刚才连了一次,因为我一连就退出来了,说说。
09:02
来,走。哦,这个地方我的服务器这边要怎么样,服务器要重新启一下。推出来就是CTRLC。好朋友们可以看到,现在呢,他又在等待我来玩一把啊,走。各位同学可以看到他拿到信息了没有,哦,他说了啊,他说诶,有一个家伙来了,你看这部看的特别清晰了,大家看。哎,你看到没有说有一个客户端的ID是192.16820.253,它的端口是多少,是517。四幺,那也也就是说,也就是说他这边就是客户端,客户端这边是不是也有端口啊,而且这个端口是不是随机分配的呀,各位朋友。你这边端口肯定是你这边端口是固定的是四个八毛,但是客户端不一样,如果你有同学,你们可以再再看,假设我退出,我再连一次,它端口又发生变化了,他可能你看有个同学来了三零这个人,你看三零这个人,他给他那边提出批协议给他分别是56602,好这个我就不再演示了,他已经配合了一下老师,好,那这样就OK了,那我现在呢,我们接着往下走,那也就是说现在我们已经成功的怎么样拿到了一个客户端的连接,但是你还没说话呀,你一句话都没说,你跑什么跑对吧,你不是要打一句话他word吗?怎么说一句话给他来各位朋友。
10:26
那么现在我们整一句话给他,那怎么走了?哎,这个时候得想一个办法了。我们要从这个控制台输一句话给服务器,服务器,服务器能接受这个话,然后在服务器端显示一下,我们要完成这个功能。那你不能马上走。你得。写东西了,好,现在我们做这样的事情,准备准备我们完成的功能啊,大家看这写的很清楚,他要完成一个什么呢?完成这么一个功能,客户端这边是。呃,客户端可以发送单行数据,然后就退出,就是说一句话才退,一句话都没说,不不能退不能退,好这个地方呢,我们来完成这个任务,注意听啊。
11:10
代码其实挺简单的,但是我讲清楚过后呢,同学们可以在这个基础上做扩展了。OK,好,客户端准备,那首先首先我们要完成的事情啊,这个假设是我们的一个功能一。功能一。那首先呢,你一定要想办法先拿到可以获取到终端的输入,那这样做的八份IO。BI,这个我们是学过的,学过文件编程,那么buffer IO它有一个有一个方法,大家应该还有印象,叫六一个reader。各位,这个6READER是不是这个地方要传一个实现了io.reader的这么一个,呃,这么一个接口是对象啊,好,这个时候我可以用这个,大家还记不记得有一个东西可能大家有点有点忘了啊,就可能我还没说过叫os.std。
12:10
还有这个叫标准输入。标准输入代表什么呢?标准输入代表的就是键盘,一般来讲我给大家看一下这个是什么啊,解释一下,打开我们这个地方有个OS这个包包。OS这个包注意听啊,OS包里边呢,它有它有这么一些东西,有有一个变量。大家看到它是一些可移植的共有的C,呃,不不,这个啊,STDIOSTDO和std分别指向标准输入,标准输出和标准错误输出,那准确来讲它其实SDDIO呢,它指向的就是这个标准输入,这个标准输入其实就是我们的这个终端。就是终端,其实这个挺不好理解的。
13:00
如果我我作为一个初学者,其实我很难理解,诶说韩老师你这个终端这个这个终端你写的hello word,他怎么跟一个文件有关系啊。其实我告诉大家,在底层终端是这样子的,他标准的其实是你在终端写的一个东西,他也会落到一个文件里面去,然后另外一个题目是从文件写的。在文件读的明白吧,本质网络编程也是这样子的,我以前不理解这个我以前就不理解,但我认为sock是不是在内存里面建的,根本不是所有的上课的本质都会落在一个文件上,这就是为什么你们如果学unix斯的同学都知道,所有东西都是文件,包括印设备都是文件。你看为什么我以前遇到一个问题,就是以前我在那个商家那个点击工作的时候,突然有一天我不是讲过悲惨经历吗?星星期六的时候,那个那个那个经理就打电话,CT给我们打电话,就说小韩你赶紧过来出问题。
14:00
它整个网络全部堵了,最后发现是什么问题,就是磁盘满了,诶磁盘满了跟你网络有什么关系,其实就是那个so sock本质它也是一个文件。啊,这样,因为他要落盘,所以说这样子,你看这它实际上像六的一个fire,看到没有好,所以说我们这地方这个这个STDIO呢,它其实就代表标准输入。这个SDDSTDIO,它代表代表标准输入,即说的再直接一点就是这个终端。终端。好,有了这个东西,那我就不客气了,我就拿到这个reader了,啊郭同学,我拿到这个reader了。Re DR第一次就这么慢啊,后面就快了,我拿到reader,那拿reader过后呢,这方应该有一个error,有可能有个error,好,我们看一下这个66READER应该就有有个L,如果我们还记得话,大家应该在八分L里面,你们可以看一下,如果你这个键的不对呢,会返回一个L看6READER。
15:06
啊六没有啊,没有那就算了。没有没有就就就不接受了啊,没有没有算了。好,没有我就直接接受。那么这个时候呢,我们这个reader就可以读东西了,这个reader就可以读东西了,那它有个方法叫read string,还有印象吧,诶我们就一行一行的读读去,一行就从终端,从这个终端。终端读取,读取一行这个用户的输入并准备准备发送到发送给服务器。那么怎么怎么发送给它呢?非常的简单啊,我先读读一句话,十寸,那就是reader点它有个函数叫read的尺寸,还有印象吧,但是这地方它会要求给我们一个就是那个间隔的符号,就是终止符是什么?当时我们说的是什么,还有印象吗?
16:02
所以起杆很难。就是一挥车嘛,就代表这个东西一行那一行,我们拿到这个信息是不是这个这个read它是。它是这个read string,它是返回一个什么东西啊,还记得吗。它是返回,返回什么东西。一个是十寸,一个就是那个它的内容是吧,Content就它的内容叫它是返回一个自己的那个自己的一个切片,是不是是这个意思吧。再再看一下啊,如果忘了的话,你看一下里面有个read,是看一下是这样子的吧,就是我们的reader reader里边有一个read,在这里看到。啊,果然是,呃,不不是返回的一个切片啊,返回的就是一个字符串,然后一个L,它返回就是字符串啊,就是一行数据,数据好,那么我们就这样写吧,就是耐。然后A,好,写到这里来,然后做一个判断。
17:01
如果error error不等于near,就代表我们这个读取失败。对,Format,我们就写一句话,叫做read。十寸error,把这个error信息给它打印出来。好,这样就拿到了这个信息,拿到这个东西过后又有个动作啊,注意你现在只是从终端拿到这个信息,但是你不要忘了一件事情,你还得把它发给我们的这个链接。各位同学,也就是说你现在已经拿到信息了,但是你不要忘了,你要把这个东西发给人家服务器,服务器想要这个东西,那怎么办呢?好,同学们现在再把再将。再将再将什么呢?那。那发送给谁服务器?那这个时候你想一想,动动脑筋就知道该用什么了。显然我们应该使用connect。
18:00
那么这个呢,它确实是有一个方法的,这个方法是con.right。但right里面大家还回忆一下,它实际上是个切片,是一个BY切片,大家回忆一下,打开打开这个这个手册,大家看到找到我们的net。哎,大家应该还有印象就是。这这个这个这个接口啊。看到这里,同学们可以看到往下找啊。看这可能里面呢,它有一个right,这个right是方法,可能会在超过某个时限制而反错误,但是一般这个超时时间,你可以通过这个time out来看,就一直不写,它就会退,但是一般会有时间等待,那这个BY返回一个N和一个right,好,这样子我们就很清晰了。那怎么把这个字符串给我转成切片呢?同学们应该很清楚的知道我们强转。来好,此时此刻一写,注意啊,这个地方会写给谁,写给那个连接,或者叫那个管道都可以,然后首先呢,它会返回一个N,代表你写了多少个字节,然后呢,有个L,如果出错会返回L,好,我做一个判断。
19:15
如果A不等于near。不等于near,我们就写一句话。我们写一句什么话呢?我们就说connect right error出错了,错误L等于多少呢E。最写如果失败了呢,你可以退也可以不退,大不了就是一句话嘛,可能丢了一个包,有可能啊,比如不太重要,比如我们聊天的时候,虽然少一句话也是有可能的。你看一个像那个大大面积并发的情况下,你跟QQ聊天,有时候可能会出现一个很少啊,可能说诶那个人给你说句话,哎,我没收到。很正常啊,因为当并发很大的情况下,有可能丢包,这个包有可能在哪里丢的呢?有可能不是你程序的原因,而是在你进行这个网络传递的时候,在路由器里面丢包了,也有可能对每个路由器它出了问题了,给你把这个包超时,它老找不到地方给你扔掉主塞,比如说最经典的案例就是网络阻塞,大家知道有些中国有些比较牛逼的这个,这个黑客老喜欢去攻击别人的网站是吧,全是用的是那个叫叫什么呢?叫做拒绝服务。
20:24
D do d DOS那个拒绝服务攻击对吧。其实那个那那种技术呢,它是相对比较原始的,但是是最难解决的,DDOS就拒绝服务攻击是最难解决的。他是怎么解决的,说我这有个网站,然后我我整很多手机,你知道吗?动机知道是什么,然后拼命的往里面发请求,一一下来了过后,比如说来了来了几百万个请求,那个服务器直接瘫掉了,而且这种这种呢是最难处理的。因为你你不好区分谁是坏人谁是好人,他们都是他们都是好人,就好像你开那个麦当劳,你正常卖卖这个汉堡吧,呃,第一天来了两个人,诶,你没问题。
21:03
然后有一家那个肯德基,他觉得你生意太好了,他雇佣了一帮一帮1000个捣乱的来排队,排完球,诶,你这有汉堡吗?有有那个熊猫肉的吗?没有啊,接着下一个,下一个又来说有没有熊猫肉的,就一上午就全排队了,那真正买买面买那个汉堡的进不来啊,这个叫拒绝服务,所以他这个丢包有可能是在这个阻塞导致的,所以说这个地方呢,我们可以暂时不去处理啊,不一定return,不一return,那么接着往下走,他如果真的出错,把这个错误信息打出来就行了。啊不不正确,好这个时候呢,我们打印一句话,我们打句话说客户端发送了多少啊,客户端发送了这个多少个字节呢,好,我们把它输出来。这个是字节啊,发送了这么多个字节,字节的数据并退出了。我现在只发了一次就退了啊。并退出好,这个时候呢,我们把这个N输到这里就可以了,好客户端就写完了,客户端你看这个逻辑啊,先拨号连上,再创建new reader,然后再从键盘里面输,得到一个输入一行,然后再发给,但是这个时候呢,你这个任务已经完成了,但是服务器这边没有做接收好,服务器马上要写代码,要给他对上好。
22:25
那服务器这边应该怎么写呢?回头干掉它SERVER0购SERVER0购,好各位同学,那现在呢,我们要怎么做呢?显然接收这个工作咱不要在这个主线上写。如果你在主先生写的话,会堵在这个地方,就会造成一个很可怕的现象,就是有一个客户在跟你服务器。发数据的时候,别的客户全部堵在这地方,没办法干事。这是最恐怖的,那么怎么办呢?最经典的方法就是用我们这个构鞋程,我来一个,诶,我来了够,我让这个为你服务,那么下一个人再来做事情的时候,我主服务并没有阻塞,因此应该写个携程,让他跟客户端进行交互,来各位同学那就简单了,同学们,那我写一个可爱的函数。
23:13
我们就叫什么呢。我们就叫process。234处理,各位同学你在处理的时候,就说你这个斜程在给他处理的时候,一个关键点是什么,哪个同学可以告诉我,是不是它最最关键的时候,这个携程一定要拿到这个连接呀。如果他没有这个conn这个链接,你啥都干不了,所以说我们应该把这个链接传过去,我应们应该把这个链接给他传过去,因此他这边必须要有个CN,而它的类型呢,它这个类型就应该是这个类型,哪个类型呢,就是我们net包包里面的con。是这个玩意儿是不是啊,那包这个CN,那我就拿到了啊,那我就拿到了,我们看是不是这样子的啊,这别别整错了,那包有一个类型,确确实实是CN。
24:04
看一下。哎,我们往下走,往下走啊。呃,往下走往下走往下走,果果然是这个啊,大家一定要搞清楚,是这这个这这个这个接口类型的,那我只要是实现这个C接口的都可以传给我,那这样子的话呢,我们就可以开始玩了,那我怎么接收呢?我就循环的接收,就你你有多少我就接收多少,我在这里这里我们循环的。循环的接收这个客户端,客户端发送的这个数据,那么当然我一上来过后呢,这个链接,这个链接你这没有关闭,这没有关闭,我到哪关闭呢?我在这儿关闭。Differ。我在这关闭是最合理的,为什么呢?因为我处理完了,我就我就关闭嘛,当然如果你是循环,那我就循环处理完了再关闭,所以它这里面应该有个动作,你不要忘了啊,关闭这个连接,这个连接很重要。这个关闭这个链接一定要关闭啊,就是用完了过后一定要关闭。
25:03
如果你不关闭这个连接会有什么后果,大家可以猜一下,如果你不关闭的话,就意味着这个这个连接会越来越多,最后服务器因为连接没有释放,而别的服务器连不上来了,所以这句话很重要,学网络编程很麻烦的。你后面我们这个做完了,我们要做一个就是那个聊天我跟你说写的时候稍微不注意就卡了,很难调。很难调,我以前写那个写那个坦克大战的时候,我就最怕出错。20个坦克一直在跑,发子弹,就有一个坦克打中过后那个那个子弹不爆,去调吧。那个20个县城同时在跑。还有一个子弹,子弹还是个线程好,40个线程哪个打上没没有动,那个打上还一打A,怎么一下隐身了,关键这调起来很麻烦,所以说我们写代码,写这种网络编程的代码,一定要尽量的小心谨慎,好那么写写关闭,写完闭过后我就负循环来读取,好,我这里是循环读取。
26:00
接受啊,就写错了。接受。OK,那你接收的时候怎么接收呢?显然你有这个connect,那你现在应该有个方法来read,说以他刚好有个read方法,郭同学connect。C点它有个方法叫read。好,我们来看看read是什么东西啊,非常的重要,同学们看read的时候呢,需要有一个切片。这个切片你先要给我准备好,你不准备这个切片,我没办法知道这个read里面有个N,这个特别重要,这个N很重要啊,这个相当重要,如果没这个N处理,待会儿会出现非常诡异的情况,而且还很暴跳。我们首先要做第一件事情,先给他make一个切片。这个切片每次创建一个新的。创建一个新的切片,为什么每次都要创建芯片?因为防止切片后面还有一堆乱七八糟东西。啊,当然我后面再说啊,后面还可以放到这,那么我写个8UFF分走make,我这个切片是什么类型的,就是BA类型,因为你传的时候就是那个按BY切给的吗?那这个我对我们来说是小K4512,那有些人喜欢1024也可以。
27:13
这个大家可能看懂啊,类型是这这写错了没有。Make。这写错了没有?没有写错啊,大家大家给点回应,这些都是以前都学过的知识点嘛,Make吗?Make切片。切边类型是这样写的吧,没写没写没写错,然后把它放进去,放进去过后呢,这边会返回一个N。返回一个N,同时返回一个L。好,这个时候呢,我们要做这个就是读取啊,就是从哪个地方,从从这个读取,注意如果你不给我发东西,我就一直读在这。这句话特别重要啊,就说他这会阻塞。这个连接他会在这阻塞,所以说我当时就打一句话,就说如果你这个对方不给我发发这个信息,就是你没有一个right动作,我就一直在这等。
28:05
这这点特别重要,不然的话不好理解啊,这句话我要写,写一下这个函数,这看书看起来简单,其实特别不好理解,就有很容易出问题这句话的意思,第一句话这个他在这里等待,等待谁等待,等待这个客户端通过通过CN,因为这两个CN已经是同一个了。啊,他们的他们链接已经形成了,就是叫套接字已经形成了,OK,通过这个等待客户端通过这个发送信息给我,如果注意听这句话特别重要啊,如果客户端没有right。没有right,这个是right right就是发送的意思,那么那么它就一直阻塞在这里,当然有可能有超时,比如说我阻塞。比如说我阻塞这个啊,这个这个三分钟,如果你老不发,我可能就自动的关闭了,也有可能啊,这个后面再说超时的事,那么这个就阻塞这里,这个这个携程就阻塞在这里。
29:06
携程就阻塞。主塞在这里,在这里。OK,那现在我们读到了啊,假设读到了,那一旦读到过后呢,同学们。我们就把这个做一个小小判断,如果我读的时候出了问题了。如果A,我假设读的时候出了问题了。那什么时候出问题呢?比如说啊,我等了一个小时对吧,你还不给我发,那我就关闭,那那就出了问题了,还有一种可能性,诶,我正在我我这个服务器正在这儿等着呢,哎,等的等的挺挺认真的,我这老在等,你该给我发给我发,突然有个家伙把这个客户端直接。关闭了,他直接把这个退出了,好,这个链接肯定就没有了,一旦一旦它检测到这个连接都断掉,它也会报错,你们待会可以试一下啊,就一旦这个这个程序莫名其妙的异常退出,这个链接自然就没有了,自然没有了过携程就会退出,当然了,有同学可能会问说,老师诶,你能告诉我这个链接它是怎么维护的吗?其实以前我们还真写过。
30:12
他这个连接它是这样子的,他每个一定时间由TCP协议发一个包包过去问你,你还在吗?客户端发一个,通过TCP底层发说我还在,又过一段时间又发一条,你在吗?我还在,有可能他这样子在下面,他有个偷偷的绘话知道吧,但但这个我们看不到。就我们看不到的啊,我们看不到,所以说这个呢,先不用去管它,我们把它打出来,就是它会自动维护这个连接,那么这个我打一个东西叫什么呢?叫做read,就是我们叫做叫服务器端的入点啊,注意题这个地方有点复杂了,服务器端的这个read出错了。错误的原因给他打出来,错误的原因给他打出来啊轴error信息。A,等于什么玩意儿呢,ER?OK,那么这个时候你读完了过后,人家有个任务,人家的任务是要在服务器端显示,注意看清楚啊,发送单行过后,那么服务器端呢,它接收这个信息并显示在终端。
31:10
那你得显示出来,表示我读到了吗?所以说我把它显示在终端,各位朋友,那显示终端的时候要特别重要啊,显示数据,显示客户端发送的内容到终端。内容到终端到哪里,到服务器的这个终端,注意啊,你现在显示服务器终端这个地方特别重要,要这么显示啊,我曾经在这吃了大亏的。我我后面没有显示这个没有显示,对这个死活这个结果不对,整的我很郁闷,他要这么显示。Print,不要打inn了。为为什么不用打LN,因为你在客户端给我发过来的时候,其实这个LN本身是读进去的。你再打一个人,你会发现显示的时候,诶,他为什么。多多来一行,这是第一个细节要注意,第二个细节显示的时候要这么写是准。
32:04
因为它是切片。所以你要把它先给我转成这个切片,怎么讲是八分,注意还有一个细节,N这个地方特别的重要,一定要把这个N带上,如果你不带上N,它就意味着把这个buffer后面的所有幺零后面带上,你后面不知道是什么东西。因为后面可能是乱七八糟的东西,所以说会出问题,这地方一定要这样写啊,要显示实际读到这种,因为这个N代表的就是你从这个管道里面,或者从这个连接里面真正读到的内容是什么,这个N很重要。好这地方啊,就写完了,那后它显示完了过后他又干什么呢?诶,他又开始回到这儿,他说来吧,我又来一把,又创建一个切片来,我就在这读,你还有吗?我就等,我就傻傻在这等着,好OK好,所以说我可以在这打印话就说这边写一句话,不大家看到我说服务器在等待你的输入。
33:01
服务器在等待,等待谁的输入呢?等待客户端的输入。啊,这客户端发信息,发送信息,当然你可以把这个客户端的这个呃地址嗯,给它打印出来,这样可以区别是谁在等谁啊在等谁,我可以我可以把它打印出来啊,那这个很简单,C,刚才我们里面有一个。Remote ADD是这个写的吧?Remote,是这个吧,诶,我把它拿过来啊,我就偷个懒。我把这个到底是在等谁,因为你将来可能这个服务器端这地方可能有很多很多的这个连接,对吧,我可以去分享。等待这个这个后端打个F。服务器在等待客户端它的这个S。发送信息好,谢。好,这就可以了,好,同学们,我们代码写完了。还了,你们写错了。是逗号啊对呃,看看对对方都没有问题啊,连接关闭了。
34:05
监听我这边也是关闭了,好没问题了,跑一下吧,各位同学勇敢的跑一下,代码有可能出问题啊,出问题我再调。还有哪地方有问题?哦,没调用,对,刚才有同学说了没调用就应该够,在哪里调用比较合适。在哪里调用比较合适?在for循环里面调用。是不是是不是应该在复循里面调用对的呀,因为我来一个except是不是就一个呀,我except是代表一个钩端呢,所以应该在哪里写go。是这地方吧,Go process。然后你这个调用的时候要把谁给我传进去,各位同学是不是要con传进去,但是大家一定要知道每一个con是不一样的,是不是,因为你每次创建一个新的嘛,好这就跑起来了,来同学们保存一下,我们来玩一把。
35:01
好,这个先退出。服务器也客户端也打开了啊,各位朋友开始玩走。走。好,他说服务器你们先不要不要玩啊,等等我这测试完了过后你们再再玩,先不要玩,好走,我先连上了。诶,这有两个包包,没有影,没有影好。这地方有两个包没有,一个是OS包包。一个是OS包包,呃,保存一下。还有什么包没引呢?Fmt这个单词写错了。Format。好,再来玩一把啊,同学们好,我把这个也打开,打开我们来看看现在是否已经连通了它的数据。好,他现在说等待看已经到这了啊,他说等待你来发送发送消息,我给他发一个hello word。Follow word,好上硅谷。
36:01
回车注意看右回车这边要推出。死,死定了,你看我是退出了,他他他他怎么在这干啥呀,在这儿。在。你看。你看这个地方有一个问题,大家看。因为你这儿一旦打了过后,他就。不停的干这事,就意味着一旦我们这发了一个错误,发生一个错误,我们应该在哪加一个东西就可以完成了,就这个地方,因为我读的时候一旦发生错误,就意味着我这个就不要在等待了,按理说就应该是return。是不是这个意思啊,就说你你读不到东西了吗?就这个错误,有可能就是因为你程序退出,就是你对方close已经关闭了,如果你不退出,它就意味着我又去,我又去不停的等,其实这个地方就会反复的就做做做一个很傻的事情,诶写错了,不是不是啊,不是这地方不是退出,是携程。
37:01
是携程啊。是这个地方退出,诶退出来呀,啊是上面上面上面这个位置啊,这个位置。这个位置为什么?因为我刚才讲了,你在读的时候有可能出错,出错的原因就是你的对方有可能关闭了,那你一旦关闭,你肯定这个地方再去负循环就没有意义了,就这个携程就没有存在的价值了,所以一定要把它注意看,这句话很重要,所以在写网络编程的时候,哪一个地方写错了都会出问题。好,再来跑一下。好运行起来server。好,运行起来,我们的client现在就没问题了,再跑一下。好,连上了他等着我发送哈。War。Hollywood ABC。回车。完事出来了,但是看到错信息看到很清晰了,大家看到很多信息。啊,他说。等待。他说等待这个客户端发送,发送时候一旦出,一旦读完了过后,他又回到这地方,再去等待的时候,再去等待的时候,他一读发现出了一个错误,什么错误呢?他说你这个地方。
38:08
和这个地方有一个错误,什么错误看这里。往下走哦,非常的明确的一个错误信息,Closed by remote host,就是你这个你的对方,对方已经关闭它了,所以说这样就出错了,但是这个错误信息呢,你可以不不不打出来,也可以自己定义一个错误,说对方已退出,这样看起来就比较轻松,就说这张怎么判断这个错误呢?可以这样判断。它其实这个错误的错误的这个这个值啊,你们如果打出来,它其实就是IO的一个e of啊,它是I off就是这个错误。是io.eof不到最后了啊,所以说有些程序员会这么判断。有些程序员是这么判断,如果这个A等于,它就代表服务器远远程服务器已经退出,我也退出来了。
39:02
就远程。就是客户端已退出,客户端退出好,那么一旦退出我也退出了。对,这样子就可以更清晰一点。好,我把这个IO说到这里来。I包说到这来。哎。好,这个呢,咱们就写完了,我们来跑一跑。再跑一次啊,大家看效果。好,走一个。跑一下。然后客户端跑起来看效果啊。好哈。诶这怎么怎么,我这退出没有没有执行吗?难道哦,可能没没没没判到这个错误,这个错误是什么,我把它打出来一下啊,我再重新打出来一下。这个错误难道还不是这个错误吗?把错误信息打出来。把错误信息打出来,L等于把这错误打出来,看下到底是什么再退出啊,这个是行量,他可能当时这个还不是这个错误。
40:07
好啊,百分杯。百分之好,如果不等于逆尔,这个错误信息我打出来。哎,这有有个错误,这IO包没有用到,我们把这粗心打出来是什么。好,走一个跑起来。好,跑起来,给我客户端跑起来,好再来一下。判断一下啊哈。好,可以了,退出来,我们看座位信息是什么。他这个错误信息是一大串文字。嗯。但是这个呢,我要看到它一个常量,它一常量我可以这样再看啊,我们来找一下这个error,我们找一下这个error啊,嗯,我们来看注意一下这个L有有没有定位,它有哪些error信息,我们来看一下这个这个服务器,服务器呢是通过这一个刚才是read。
41:08
Read里面呢,会返回一个error,我看这个它有没有定义的这种error信息,我们打开这个ne包。那个包看它常量里面有没有D这类似的这个L错误信息啊看哎,果然有个type l进去看一下啊。哦,看到没有。它这个A也是个接口里面呢,有个timeout有个这个。好,那么我们看这里面这个东西是什么。点不进去。按下C在电视吗?我对的这边能看到他有些定义些常量吗。哦,这啊,这个就是返回还是个字符串,没用,它返回的还是一个字符串,就error又是一个接口里面呢,它有一个这个,但返回的还是字符串,所以说这个地方就暂就先暂时先暂时先处理一下啊啊暂时就他这地方是一个字符串,这个字符串好,那么这样就退出,退出过后呢,我们就打印这个,那如果说你这退出了,服务器还是可以继续连的啊同学们注意看,我再来玩一次,它又连上了。
42:14
你看他又连上,他就说你又等正带那IP地址发生发生一个变化,我再输一个hello。我又退出,好,我又退出,我再连,我还可以连。还有一点。连上我有ABC好输出。这样就不停的就开始进行这个循环了,那么现在呢,我把这个代码就第一个最基本的功能说完了,现在我给大家留一点点任务啊,大家看看你们能不能完成,中午的时候。这个任务呢,是这样子的,同学们。第三和第四,通过终端输入数据,一行一行的发送,并发送给服务器端。那么在终端输入就在客户端啊,客户端的终端注意。就这地方是说的客户,那中间输入一个access啊access就是如果它输入一个access,表示程序退出,如果我不输这个呢,就反复的进行一个交互。
43:10
我再说一遍,就是说现在我们是输了一句话就跑了,客户端我是输了一句话就走了,但是我希望他能够反复的输,一行一行的输,输完了过后这边这边就显示出来他到底输的是什么内容。啊,他是出的什么内容,然后呢,最后如果客户端输入的是这个人这个指令好,我们就代表退出。同学们中午的时候可以动点脑筋啊,这个呢,如果说你这个听懂了,我把元,我把代码也分享下去啊,你如果听懂了,你稍微的动动脑筋,能够把它搞定好,我把这个呢,先给大家板述一下。好,我们现在第一个任务啊,把它整个板述一下,我们这个思路是这样分析的,思路是这样分析的,那么我们的代码是怎么实现的呢?代码的实现。哎,代码的实现来走一个。
44:03
代码实现,我们来玩一下到底是怎么走的。好,标题三,代码是这样走的,我们先写的是客户端和,呃,先写的是服务器端,啊把服务器端这块拿过来,服务器端是完成了这么一些功能。好,先把它拿过来啊,同学们。好,那么首先呢,我们画了一个图。对,然后呢,说了一下服务器这边需要完成哪些功能,对不对,诶呃,具体的步骤是这样子的。连接成功是怎么处理的?好程序来测试。好,这是我的步骤,那服务器端的代码呢,是这样子的。服务器,服务器端的代码,它的代码。A代码。代码呢,我给大家整理到笔记里边去。就是刚才写的这这样一堆一堆代码server点购,因为很多,所以说我直接连接复制一下。
45:01
好,我把它放在我们的这个笔记里面去,这个呢,我也不截图了啊,就直接。给同学们放在笔里面去。好,放好。好,这是第一步,第二部分呢,我们又紧接着完成了它的这个客户端,那客户端的功能呢,我们完成了第一个和第二个,第三个和第四个呢,留给同学们中午先思考一下,就想想看看自己能不能完成好,这是客户端的功能。客户端的功能好,客户端的功能呢,我给大家进行一个小小的板书。啊,小两本书。OK,好,这里呢,我给大家来一个这样的标号。对,来一个这样的标号。好的,那具体代码呢,这一部分代码是这样子的。好的,代码我先拿到这里来啊,各位同学,找到我们的这一个client.go。
46:01
柯南订购我给大家板说到这里。好的表格。中午的时候,中午的时候大家可以思考的问题写到这,中午思考的问题呢,就在这个地方想办法,如果能实现的同学啊,最好。当然你如果确实实现不了也没有关系,呃,下午呢,我还会去讲,但大家可以想一想,就说尽量在老师讲解之前呢,自己把它实现就是最漂亮的。好,放到这里。好,这是思考题。
我来说两句