00:00
好,那么关于这个IP地址所代表的这样一个I dress这个类的使用啊,咱们就说到这儿了,比较简单,两个方法,呃,两两个这个创建对象的方法,然后呢,两个呢,具体的调用的这个方法。行,然后这个完了以后呢,下边我们就来看看具体的,咱们现在想实现一个通信了,这时候呢,我们面对的两个传输层的协议,一个呢叫ttp协议,一个呢叫udp协议,这块呢,首先提到说这两种协议呢有什么区别?OK,那这块我们再回到咱们这个课件这个层面,这块呢,咱们就找到传输层的这个协议。OK,一个叫TP,一个呢叫udp。哎,这块对应的我们上面讲的这个协议里边的在这儿呢哈。传输层的吗,他俩。好,那么这两个协议我们看一看,基于这两个协议的话呢,我们下边呢,才能去写这个代码了。这个首先呢,都是在我们这个net这个包下的是吧,那支持的我们两种协议啊,Udp用户数据报协议,GDP传输控制协议,这个呢,都是简写了。
01:01
好,那么这个tdp协议呢,这块呢,有相应的一些描述,这是udp的,有的时候呢,在这个笔试题当中啊,会问一下你说tdp协议和udp协议它们俩的区别是什么。那这块呢,大家稍微的关注一下,了解一下。好,这块我们首先来看一下,说这个ttp企业啊,进行通信的两个进程,一般呢,我们习惯上称为呢,叫客户端和服务端。啊,客户端服务端这个udp呢,一般习惯上说为称作呢,叫发送端和接收端。当然这个呢,就是个名的事儿啊,这是次要的,主要呢是这个啊,所以呢,我们这个TP协议,在使用这个ttp协议呢,进行数据传输的时候呢,首先呢,必须要建立一个ttp的一个连接。这个连接呢,就是基于我们这个客户端和服务端的,咱俩连接确定连接上了。哎,咱们再进行数据的传输。所以说呢,呃,先连接再传输,进而的话呢,它是一个可靠的通信方式。哎,可靠通讯方式这个连接呢,还提到了一个叫三次握手,通过三次握手来确保咱们通信的双方呢都在啊都在了行,那我下边呢开始发起数据。
02:12
哎,这个一般情况下呢,我们对于TP协议来讲呢,通常都是客户端主动的发起这个链接。啊,要求呢,去请求一些数据了,一般都是他主动的,OK,那在这个主动呢,发起请求之前呢,先要建立这个连接,它是可靠的,而对应的我们这个udp呢就不是了。Udp的话呢,它就不需要建立连接。就上来呢,诶发送端呢,比如就发送数据给这个接收端了,我不管你在不在,我就上来就发,发完之后呢,你要在呢,你就能接收到,你要不在呢,那就接收不到。哎,它呢是这种不需要建立连接的,进而呢,它也是不可靠的。OK啊,其实这两个呢,一对比大家呢就可以联想咱们生活当中的GDP呢,类似于打电话。啊,这个udp呢,类似于发短信或者电报。
03:01
那这样一说就比较清楚了,比如说打电话的时候呢,对方呢,首先他得接通啊,甚至有时候接通以后呢,你可能还会喊一下对方的这个这个。要是长辈了,你可能是吧,就称呼了,或者呢,你是朋友啊啥的,你就直接喊他名了,确定是他了,然后你俩才能说话是吧,就是打电话呢,他是一个非成靠的一个连接了。啊,你也知道对方是他了,你也听出他的声音了,下边开始说这个事儿,这肯定都是可靠的,而对于这个发短信的话呢,就不一定了,短信啊,微信啊都是这样子的,比如说发动的一个是短信,对方的话呢,信号不好,没接收到,没接收到那就没接收到。啊是吧,这个呢,就属于它不可靠的一个连接,包括呢,我们收到很多的这个垃圾短信,不都是如此吗?他可能这个一个机器呢,它同时呢,发送几百个垃圾短信出来了,可能有一些号码根本就没有是空的,空的就空的了。哎,他反正是发了是吧,这呢就不需要建立连接。啊,这呢是它的一个区别。好,那么接下来啊,这块还提到了一个我们这个三次握手,哎,保证他这个可靠的,还有一个叫重发机制,那如果说呢,发送过去之后呢,对方呢,这块呢,没有一个确认消息,他还会重新发送。
04:10
啊,确定了对方在了以后,他才会接着呢,发送它主要的这个数据啊,所以它是可靠的,下边那么一旦呢,建立了这个连接通道之后呢,在我们这个ttp当中啊,可以进行大数据量的一个传输。这块呢,就建立了一个。啊,建立这个数据通道,我们就可以通过这个,呃,输入流啊,输出流啊,进行数据的一个传输了,它是一个大数据这样的一个传输,而我们这个udp呢,刚才我们上面提到了,它叫用户数据报协议,这个数据报啊,它有一个大小的限制。每一个数据报呢,大小限制在64KB以内。哎,同学说,那我这个是不是数据整个就不能超过64KB呢,也不是,就是你可以发送很多的数据包。OK啊,诶,所以这块呢,它有一个单独的数据报的一个限制啊。这个现在咱们发这个短信呢,大家好像感觉不出来了啊,就是以前的时候呢,像我刚上大学的时候呢,印象很深哈,那时候呢,买的都是这个功能手机啊,功能手机呢,当时就在这个学生会的时候呢,给各个这个呃,几个部门呢,大家相互之间发短信啊,当时呢,发送这个信息的时候呢,就比较多一些哈,经常就卡在这个字数哈,就这个短信的时候呢,你编写忘了具体是多少字的时候,它就一条短信。
05:22
是吧,当然你在这块稍微的,哪怕你多了一个句号,它立马会提示你呢,是两条短信。呃,这个大家可能现在用这个手机应该是没有显示这个事儿了,是吧,原来的话呢,这个很明显哈,你要写的再多一点的话呢,这个再稍微写一个就变成它就提示你三条短信了。所以呢,就相当于这个短信呢,它在发送的时候呢,它每一条短信也会有一个大小的一个限制。OK啊行,就类似于我们这里边这个数据报一样。嗯。行,那么这儿呢,我们似乎说的呢,都是TGP的一个优点,那其udp呢,似乎呢,都有缺点啊,其实呢不然啊,它的一个好处什么呢?它呢就是发送数据结束以后呢,无需释放资源,开销比较小,通信效率比较高。
06:06
你像我发短信的话呢,你可以通过时间的发送。是吧,几十个上百个甚至更多的这个短信的信息,打电话的话呢,就是完全的一对一的这样的一种通道的啊,所以呢,它的主要特点呢,体现就是可靠的可以进行大数据量的一个传输,这个传输完以后的话呢,它还是需要呢关闭这个连接的,它整个效率相较于UTB来讲呢,Udp要更高一些。啊,这是它的一个特点。你像这里边儿我们提到了,它不需要建立连接,它可能会有这种丢包的这种场景。OK,哎,所以它呢,使用的场景是什么呢?比如说音频呀,视频呀,普通的这种数据传输啊,视频会议啊,一般呢,我们会考虑使用这个udp的协议。啊,因为这时候我们可能更多的关心的应该是实时。啊,这边这个人说完话之后呢,那个人呢,基本上能够同步的去知道他在说话。OK啊,那中间的话呢,至于说丢了几帧这个画面没关系啊,基本上不受影响的。
07:01
啊是这样一个场景啊,就比如说咱们现在不是也有几个同学在线上嘛,这时候大家可能更多的关心的就是这个尽量的这个视频呢,应该要实时一些啊,延迟的话呢,你比如说控制在十秒以内。是吧,诶,但是这块呢,你相应的丢一些,呃,具体的几个画面几个帧,其实呢,呃,我们说肉眼呢,也感受不出来,没关系啊,包括呢,大家看这个世界杯也是一样,世界杯的话呢,你说你更关心这个画质呢,绝对的清晰,一帧也不能丢,你还是更关心他的实时啊。肯定呢,是下折是吧。OK啊,所以这块呢,我们相应的一些这种视频类的啊,通常我们会选择使用这种udp的这种协议。OK啊,对数据的可靠性要求更高的呢,我们通常选择叫GP的相关的这种协议。啊,这呢,就我们说的这样一个场景啊,行,哎,包括的话呢,你看我使用这个相应的这个客户端叭,如说像这个360啊,打开一下啊,他这不是有这个相应的一些小的一些插件这种啊。嗯,比如说我看是不是这个啊。
08:02
把这个呢打开啊,打开以后呢,你看这个网络连接是吧,这块呢,就提示出来我们相关的一些这种。程序啊,在连接的时候呢,我们使用的这种协议,本地的IP是多少,本地的端口号是多少,目标的IP目标端口号是多少,那这块它都有显示。是吧,哎,这样一个场景啊,行。这个呢,就是我们相应的提到的这样的一些协议的一些问题,OK啊。好,这个我们再拉回来。这呢,我们就提到了一个,首先是两种协议的一个对比,这个呢大家稍微熟悉熟悉啊,然后基于这样的一个不同,我们下边呢,去写对应的这个代码了,那首先这个代码的话呢,我们先来讲这个叫ttp的啊。第一批呢,我们在写这个具体代码之前呢,先提一下,刚才这块讲到了叫三次握手。哎,通过握手呢,我们建立通道了,然后呢,我们再进行这个通信了,啊,什么叫三次握手呢。那就是下边呢,我放了这样个图,这个图里边呢,其实提到了我们在诶这个握手的时候呢,会有一些报文的发送,这个呢,就是具体这个报文的信息了,这个报文这个具体信息呢,哎,我就先不详细的去讲了,这个大家呢,其实这块看看就行,我呢比较形象的,咱们把这个事儿呢理解一下就行了,OK啊。
09:12
呃,什么意思呢,就是我们呢,呃,有了第一步走过去,第二步呢回来,这就算是叫两次握手了,然后第三步呢,客户端再给服务器端呢,再发送一个,这就叫三次握手。就经历过这样的一个交互。啊哎,交付完之后的话呢,我们说呢,就保证双方呢都在了,然后接下来再去传输这个数据。OK啊,行,这呢,我举一个场景。啊,你比如说这个客户端这块呢,假设呢,就是我是吧。然后呢,这个服务端这块啊,我举例,比如说咱一个同学,比如那个董嘉泽吧。是吧,现在呢,哎,我要跟他进行通信了,我要确保,确保呢,我俩双方呢,都得知道彼此啊,哎,我这块呢,会先给大家发送个信息,举个例子啊,比如说啊,你好啊,我是这个康师傅是吧,我就发过去了,然后呢,董亚在这块呢,哎他呢,怎么着呢,他说哎你好,我知道你是康师傅。
10:07
啊,然后呢,他就发过来了,发过来之后呢,我再给他发一个。啊是吧,好的,我知道你知道我是康师傅。哎,就这意思,哎这样的话呢,就是双方呢,就都知道彼此了,说下边呢,来咱们俩开始说点这个。说点事是吧,哎,这就建立这个通道了,就可以通信了。嗯,OK啊,然后这里边儿这个123的话呢,不需要呢,咱们在代码中去写,咱们呢,就只管着需要发送数据就行,在发送之数据之前呢,它会自动的去建立这样的通道。OK啊,其实这个事儿的话呢,也类似于咱们生活当中啊,比如说呢,大家以后工作了,这个你在公司里边呢,可能就是一个普通的一个员工了,这个呢,你可能有自己的leader是吧,这个leader的话呢,给你派发一些任务的时候呢,其实呢,也需要建立一个通道,假设你们属于这种远程的是吧,这块呢,它比如说呢,给你发送生活的这个,咱们实际工作当中一个场景,直接给你发送那个任务。
11:01
发完之后的话,你这块你看到了,看到之后呢,你说行。也就这么着吧,你也不给他回信息,那这个呢,是不是就差点意思啊,他也不知道你到底收到没有是吧。哎,这块呢,你可能就说一个好的。哎,收到是吧,哎,他这块呢,看到他是不是就知道你收到了是吧,按这样来讲的话,其实应该再来一次。他应该再给你发一个好的,我知道你收到了。是吧,哎,这样的话呢,才是确保的,就相当于啊,你知道对方还看到你知道这个事儿了。那这个呢,就叫做三次握手。OK啊,行。这个呢是握手的事儿,然后呢,等这个结束连接的时候呢,还得来挥手。啊,挥一挥手是吧,哎,挥几次手呢?这块叫四次挥手。啊,整个的话呢,就是这样一个过程。啊,这样过程,这个过程是什么样的呢?比如我们这块呢,通常啊,咱们不都说呢,主动的发送这个数据的连接啊请求啊,都是这个客户端吗。
12:01
说现在呢,我们要结束这个连接了,这时候也是客户端来说的啊,客户端说的话呢,说我这块呢,要结束啊这个链接了。它呢一呢就发送了一个,哎,这个就算一次挥手吧,是吧,说呢我要结束这个连接了,然后这个二的话呢,是服务器端,服务器端的话呢,现在呢,其实还跟你在建立连接呢,而且这个数据呢,有可能还在传输好,它二呢就先返回了一个,这呢我们算第二次回手啊,他就说好的,我收到呢你说的要结束连接的请求了,然后呢,我这块呢,把最后这个数据呢发送一下。然后呢,他这块呢,就开始呢,把最后没有给这个一发送完的这个数据不是本一了,给这个客户端发送完的这个数据呢,就继续发送,同时呢,他也跟他的这个上级呢,上一层呢去请求说我们不要呢再去发送数据了,因为他已经要断开连接了。啊,这个第二步呢,主要就是告诉那因告诉我们这个客户端呢,说我收到你这个请求了,同时的话呢,呃,他这块也不再去继续呢。呃,接收其他的这个客户端的一个请求了。
13:01
好,然后呢,这不还剩一些数据呢,没有发送完嘛,他就先发着啊,然后呢,当我们这个服务端呢,把这个数据呢,给这个客户端发送完以后呢,他就发了个三了,说我这块呢,这个相关的数据已经给你发送完了,我呢是可以接受你这个断开请求的这个。断开连接的一个请求了,哎,他发了一个三过来,然后四呢就说好的,那我就断开连接了,哎。就这样。所以这块呢,就是1234。啊,然后呢,这个发完之后呢,整个这个链接呢,就断开了。啊,理解一下我们这个过程啊,然后呢,这个过程当中啊,因为咱们说你服务端呢,假设就这一个,你客户端的话呢,是可能有很多个的啊,所以这块呢,我们得确保呢,是跟哪个具体的客户端,我们在进行这样的一个回手啊,包括上面这个握手也是一样啊,所以呢,我们都会有相应的这种报文,大家呢做彼此的这样一个匹配。啊,就是这样的一些信息,这个信息的细节呢,就不在这儿去说了啊。OK啊,这个呢,大家如果是本科呢,学这个计算机相关专业的,然后呢,计算机网络当中这些基本的内容都会讲解到啊。
14:05
OK,好,这个呢,我们就做一个了解就行啊,这个完了以后,那下边呢,咱们就开始来看看针对这个TDPUDP该怎么具体的写代码了。好,那么接下来的话呢,我们首先呢,讲一讲这个TEP啊,以它呢为一个主要的传输层的协议呢,我们看如何呢,去同心了啊嗯,这块呢,讲这个编程之前呢,首先我们提到一个概念,这个概念呢叫做socket。诶,So,是什么呢?呃,其实上比较简单说,网络上具有唯一标识的一个IP地址和端口号组合在一起,就构成了一个能识别的叫标识符的套接字,叫做socket。有点绕是吧,简单来说呢,就是一个端一个IP地址和一个端口号组合在一起。他俩呢,就构成一个socket。啊,这个soccer呢,也是一个类。这个类呢,你可以理解成了,它有俩属性是吧,一个呢叫IP地址,一个呢叫端口号。
15:00
那就好比是那一个key,一个value,组合成一个entry。啊,就这样理解就行,那我们拿着它干什么用呢?咱们下边呢,说的叫tdp的网络编程,Udp的网络编程啊,不管是GDP还是udp啊,其实呢,也都可以称为呢,叫socket编程。啊,因为呢,我们在编写类代码的时候呢,都要用到这样的类。OK啊,这叫socket。行,这个呢,清楚以后,下边呢,我们首先看一看这个ttp网络编程啊,怎么就实现通信了,这块我画了个图。啊,可能大家猛一看说哎哟,看着挺复杂的,其实呢,咱们剖析一下话呢比较简单。好,我把这个客户端呢写到右边了,左边呢是这个服务器端。行啊,然后呢,这个客户端的话呢,咱们说呢,通常它是主动的去请求服务器的了,所以呢,这块首先我们在这个客户端这块呢,咱们得创建一个socket。哎,刚才我们提到这个事儿了啊,网络编程这块呢,也可以称为呢,叫socket编程啊。这个客户端呢,创建一个socket,它呢,你看这个参数。
16:03
是不是就封装了一个IP地址和一个端口号了?对啊,那这时候问大家猜测一下,我们这块写的这个IP地址和段框,你说是他自己的呢,还是说那是对方的呢。是吧,哎,这是一个问题哈,实际上呢,这块呢,它指明的是对方的。对,就是你要跟谁通信是吧,对方的IP地址和对方的一个端口号。那就是服务器端呗。那没问题啊,然后那服务器端这块呢,它这块创建的叫做server socket。OK啊,然后它这里边儿呢,只需要填一个端口号就可以了,因为你自己启动的时候呢,你的IP是多少,其实就已经确定下来了。啊,就像我的电脑呢,我去通信正常的,不就是咱们刚才看到幺九二点幺六八点。21.107吧,是吧,这样IP地址了哈,好。然后的话呢,我们诶这个接着呢,就发送针对服务器端的这样一个请求了,发送过来之后的话呢,有可能这块呢就断断掉了。
17:00
因为呢,有可能我们这个服务端呢没开。没开的话呢,这个客户端你要去连接这个请求,他上来了就想去握手,是不是就失败了。失败了这块呢,就说断开连接是吧,未连接成功这样一个情况。好,那如果呢,我们这个服务器端呢,也没什么问题啊,这时候呢,他就可以接收咱们发自于客户端的这个socket了。这个accept这个方法呢,是一个阻塞式的方法。啊,一会儿我们去演示这个事儿啊,就是这块呢,如果我们要没有这个请求过来的时候呢,他就一直在这等着。然后呢,当你发送过来一个之后呢,它这个方法呢,就接收到了,然后继续往下走。有点像咱们scanner里边那个或叫next in的方法一样。咱们调调方法的时候呢,这时候代码也在这等着,下边你有代码也不执行,一旦呢,你从控制台上输入一个123,诶这个方法呢,这不就接收到了,就往下走了,这都叫阻塞式的方法啊。好,然后呢,一旦接触到你的以后呢,它就往下走了,相当于呢,双方我们就建立了连接了。一旦建立了连接以后,咱们就可以双向的,你给我发,我给你发是吧,就可以通信了,通信的话呢,我们仍然使用的是这种流。
18:04
OK啊,对于这个服务端和客户端来讲,双方呢,通信的时候,如果说客户端呢,想给服务端发。那么我们站位呢,你现在得先在这个客户端这块,你想往外发,那你就是get output stream。如果你想接收。那就是get input stream,那服务端呢,也是同样道理,通过我们这个呢,去调get input stream和get output stream。这个就是往外了,这个get in呢,这就是写进来的是吧。好,这个呢,就是双方的这样的对应的方法,最后呢,你传输完了断开啊,释放我们这个socket这块呢,也关闭一下来断开连接就没问题了。好,那么基于咱们说的这样的一个场景,下边呢,我们看一下具体的这个题目,这块呢,咱们一共呢,针对TP呢,就讲三道题啊,大家下来呢,有兴趣呢就写写就行啊,咱们这章相对来讲这个重要性呢,就差一些啊。好在这个包下呢,我们去新建一个啊,TCP的一个TEST1啊。
19:03
来,咱们写这道题啊。呃,这道题的话呢,那首先呢,涉及到一个客户端,涉及到服务端这块呢,我们就得有两个端,或者说两个具体的这个。进程啊就是吧,好在这块的话呢,我们首先啊,我就要test一下。它呢,作为咱们的叫发送端。我叫剩的吧。哎,这呢,我们把它呢也添加一下啊。好,然后呢,再来一个端,这个呢,作为我们的这个server端。啊,这个叫客户端,客户端法叫client吧。在这写一下啊。哎,这个呢叫客户端,这个我们叫服务端。诶,或者要服务器端都可以啊。好,然后呢,我们这个客户端呢,给服务端呢,发送内容,发送完以后呢,这个我们服务端呢,把它打印到他自己的这个控制台上。比较简单的一个需求啊。嗯,这个事儿呢,我们想想怎么做来着。
20:00
诶,这块我们刚才提到说他要创建一个socket是吧。哎,他要创建一个socket,然后呢,这个socket的话呢,我们跟这里边的个服务器端的一个server socket调一个access方法呢,进行一个接收,诶一旦接收了,那就相当于是建立了这个连接了,建连接以后呢,我们接着来去传输数据就行,哎你看我们先简单写写啊,它呢创建个socket。他创建这个socket之后呢,哎,其实这块呢,我们对于服务器端来讲,这呢,我们也是首先要创建一个叫server的socket。啊OK啊好,然后呢,我们这个serve呢,需要调一个方法。哎,Accept这个方法。第二的方法呢,我们说来接收客户端的socket。哎,上面这烧的话呢,怎么就表示你这块能发送过来呢,直接呢,你造完以后呢,咱们就往外发数据就行。啊一发数据,其实呢,前提呢,就是这个soet就得跟着过来了啊,我们这块去接收,接收到以后啊,如果能接收到了,那说明呢,咱们就建立了这个通道了,建立通道以后呢,下边呢,我们就可以呢,使用这个客户端的socket呢,要发送这个数据。
21:07
然后我们这块呢,就来接收数据。行,然后呢,发送完了这块呢,比如接收完了,诶后边这块我们可以呢,是不是就关闭socket。哎,关闭我们的socket,然后这块呢,你表示你接收过来这个socket我也不用了,这个呢,我们也可以呢叫诶关闭咱们这个s socket。这个关闭呢,是发送这个自这个客户端的这个socket,自己呢,这不还有一个叫server socket吗。这个set的话呢,这个咱们现在是练习了,哎,我就不用了,我就关掉了,其实正常来讲呢,对于这个服务器来讲呢,通常是不是24小时都开着的。随时用户想连都可以,这里边呢,三四点了,失眠了睡不着了,打开一下你相应的,比如说今日头条啊,有的打开抖音了是吧,这时候呢,如果提示说是服务器一断开。啊,服务器也睡了啊,那不行是吧,呃,随时呢,你打开这个呢,都能连接啊,所以这块一般服务器呢,咱们都不关啊。
22:03
好,这个呢,就是整个这样一个过程,来我们开始写吧。这块写的话呢,咱就先写客户端吧,客户端这块呢,我们创建一个socket啊好,那这块我们就声明一个socket。然后你一个具体的一个socket。这么着啊,CTRLP一下它呢,这个构造器也挺多,咱们刚才提到了是不是用这个。那这个里边呢,有一个IP地址,有一个顿号,我们也提到了,这就是对方的IP地址,对方的断口号,哎提前了,咱们在这儿呢,声明一下啊。啊,比如I address啊这块我们就调用它的一个静态方法叫get by name是吧。这个呢,我们就指明对方的一个IP地址了啊,我这块的话呢。嗯,其实写哪个都行是吧。我写这个地址也可以。啊写127.0.0.1呢,也可以是吧。咱们现在教室呢,是一个局域网了。啊,局域网的话呢,就比如说大家呢,哎,你写一个客户端,你旁边这个兄弟呢,写一个服务端。
23:02
是吧,然后你俩呢,其实就可以进行通信了。啊,咱们在一个局域网内呢,是没问题的啊好,这个呢,就get by name,然后呢,我再整一个端口号啊。账号呢,比如叫8989行,那这个位置呢,我就把这个ane dress,还有我们这个port呢,我就写到这了。啊,这个呢,是来声明哎端口号。哎,这个呢,来声明IP地址。嗯,IP地址好,这个呢没问题了啊,这个呢有这异常啊,咱们此时呢,就把它俩先肉出去啊。那这样。好了这块呢,我们就创建好了,创建好以后的话呢,我们说呢,对于客户端来讲呢,你就可以呢去发数据了,发数据怎么发呢?哎,我们提到它有个方法叫get output stream。往外发嘛,是吧,这样的话呢,我们就得到一个输出流是OS。
24:01
那么一旦得到这个流了,下边其实我们就还算是比较清晰了啊,咱们拿这个OS点我就去往外write呗,这呢它是一个字节流是吧,字节流呢,传输呢,不就是字节数组吧,不是就传输一个,这就传输多个呗。那这块我们比如就写个这个,这块写的话呢,嗯,我就。写一个中文吧,比如说哎你好,哎,我是客户端是吧。啊,请哎多多关照啊。哎,这个呢,你写字照不行,那就get一个best呗。这个get呢,这块还得指明一个次数集,咱就用默认的也行,默认的就是UTF8了。啊,因为咱们这个不是设置过U8吗。就这样出去了,好,那写完以后呢就完事了,那最后这块呢,我们就关闭一下,关闭的话呢,这块一方面呢,是我们这个socket,你说我不想用了啊哎,那我这块呢,就close一下。另外呢,你发现呢,我们这是不是还有个瘤啊。啊流呢,我们也给它做一个close。哎,所以这块呢,叫关闭socket,哎,关闭流。
25:01
好,那既然呢有这样资源的关闭了,其实我们用呢,就差点意思了是吧。这块咱们改一下吧,这时候我们从这到这啊,CR out,再来一个T,来一个try catch finally。啊,1.prints。才这样,然后呢,把这两个呢,我们再往上提,Ctrl shift加上。提上来啊,然后单独的我们再alt加一个回车,再catch一下。哎,这样一下,然后这个呢,也是alt加个回车开开一下。哎,这么着是吧,然后相应的这块我们再来个if判断呗。哎,这个socket它呢,不等于。No是吧?嗯,这个OS第2NONO这样写行吗?是不是也可以啊?模板是吧。好,然后呢,CTRL再加个L全是这个格式,这个呢我们就讲了啊。你看这会我们一调这个拆开的话呢,看着这个结构呢,稍微的就复杂一点似的啊。
26:02
其实呢,还是这么几步,哎,Socket创建这算是第一步,哎,第二步这个有了set以后呢,我们就可以呢,获取一个输出流啊,去发送数据了,然后第三步关闭资源。好,那这个客户端呢,就写完了,然后下边我们看这个服务端啊。服务端这块的话呢,诶,我们首先呢,你得有能力去接收客户端的这个socket了,所以呢,首先我们得创建一个叫server socket。哎,Server socket,然后呢,这块我们就直接扭一个叫server socket了,然后CTRLP一下,它这块呢也有参数啊,构造器选一个,哎,我们只需要呢填一个part就行。好注意啊,咱们上面这块写的叫8989。是吧,声明端口号准确的说应该是声明是不是对方的端口号是吧,然后这个也是声明对方的。IP地址。啊,然后我们这个服务端呢,在启动的时候呢,你这个相应的这个进程呢,在哪个IP里边也是确定的。
27:05
啊,它也是确定的啊,所以说这块IP地址呢,就不用指定了,然后这个专用号呢,你得指明一个,其实咱们应该是先写这个。根据这个呢,是8989你在写的这个。啊,看由谁决定谁啊,注意一下。好,这个呢,咱们写成8989了,我就把这个泡呢,我就往这一扔。这就可以了。啊,这呢,我们的server socket来,咱们暂且的话也先Rose一下啊这呢,我们创建好它以后呢,下一边下边啊表明呢,你可以接收来自于客户端的这个socket了,咱们就拿着这个server socket去调,这个方法叫accept方法。好这块呢,返回的就是一个socket。啊,就是这个socket这个方法的话呢,我说它叫做阻塞式的这个方法。就是说呢,如果我们这时候呢,服务端开启以后呢,客户端呢,没有谁去连他,他就一直在这等着。等着呢,客户端来连举个例子啊,你比如说暂且呢,咱们在这块我写一句话啊叫。
28:04
服务器端。已开启。哎,这样的一句话,好比如说现在呢,我把这个服务清单呢,咱们先跑起来。跑起来了啊,这时候你看一直在这执行着呢,啊,此时的话你会发现呢,咱们根本没有说出这句话,哎,就是因为呢,我们现在其实在这儿呢,阻塞这呢。就跟咱们这个scanner叫next int方法就是等着你去输入呢,是吧。好,这个呢,就在这等着了,相当于就开启了啊,这个暂时我就先关掉了啊。行,然后这个呢,如果说呢,你客户端呢,要发起对于他这个端号的一个连接了,那我们这个socket呢,就能够接收到,能够接收到以后,哎,我们下边呢,就可以呢,从这个socket里边来获取数据,或者说呢,先获取个流,从流里边拿数据哈,所以呢,这个socket服务器端呢,要接收数据啊,就叫get个input stream。所以这个方法呢,其实比较简单是吧,一个呢叫get input stream,一个叫get output stream啊好得到这个流了,下一步呢。
29:04
从流里边是不是该取数据了,取数据,取数据咱们是不是,哎,可以用一个数组了是吧。八分哎,你有一个bad型的,比如1024。In的一个L音,这咱们不是上一章里边没少写吗?二音。哎,咱们。哎,是不是让is.read的到这个八份里边是吧,返回这个长度呢,如果不等于负一,表明呢,你里边呢是有数据了,这个数据呢,咱们先比如说放在一个字符串里边。啊,把八份呢,往那一扔0L1这么着是吧,然后这块我们输出一下航航就不要了,哎,就这样呗。好,通过这样一个方式呢,我们把它呢,就输入到咱们这个服务器端这个控制台上了啊,那输入完以后呢,没啥别的事了。是吧,这个呢,可以在我们服务器端这块呢,我们写一句话吧,叫哎,这个上面没有画行了,咱们这换一个行啊叫数据接收。
30:00
完毕。OK啊好,然后呢,最后我们说关闭对应的,比如这个。诶,来自于客户端的这个socket不用了,哎,做一个close这个服务器端的话呢,如果你要不用的话呢,也可以给他close一下。当然这咱们练习的我就加上了,实际情况的话,这个就一般都不让他去关掉了,随时可能有服务客户端的是不是过来呀。OK啊行,嗯,然后对应的这里面还有流那is.close一下。所以呢,关闭他俩还有这个流啊。好了,写完了啊,写完以后的话呢,同样呢,因为你有这个资源的关闭,确保他们一定能执行,Rose呢就不合适了。所以从这。到这儿是吧,Ctrl out,加个TTRY开始finally。1.prints,然后把这三个呢,咱们给它c shift上整过来。在out加回车catch。分别的都如此操作。
31:06
嗯,这么着啊行,刚才这块我为啥改呢,这个idea的不同版本呢,这块识别的不一样啊,那刚才呢,它默认呢,总是给我去死肉出去,你要用到2019这个版本的话呢,它默认的其实就是这个不用改了啊,咱们现在就让他在里边呢,去直接打印啊。好这块呢,我们再来个if啊,或者这块直接刚才我们这样写的点N。是吧,那就这样,你再把他那给他提上去啊。Server socket。嗯,闹闹呗。嗯,把它提上去。点闹闹是吧。来提上去啊,CTRLL再加一个L来调格式啊,行,这个呢,我们就完事了。啊,写个步骤啊第一步。创建一个socket,第二步啊,接收客户端的这个socket,第三步接收数据了,最后关闭资源。完事。好,完事了啊,完事以后的话呢,我们现在先起谁。
32:04
是不是一定得掀起服务端了,我要现在掀起客户端。这时候服务端没起他这块呢,就试图获取这个连接啊,要握手等一等,是不是就没握到。说连接被拒绝了是吧?啊因为服务端呢没开哈,好现在的话呢,我把这个服务端开起来。正好开启后呢,大家有可能有同学喜欢的扣段,你先别连我啊。这个你要连我的话呢,我这块只写了一个except是吧,哎,这个我就停了哈,行,现在呢,我就等着呢,等着的话呢,我就哎用这样一个客户端呢,去连这个服务端了,来我们走起这个IP的话呢,恰好就是我现在服务端开启的这个IP。来我们run一下,你看这个事儿就成了是吧,成了以后的话呢,你看一下我们这个客户端这块呢,其实啥也没有。嗯,但我们这个服务端这块的话呢,就有信息了。呃,一方面咱们在服务端呢,是不是自己呢,自己写的,这是啊,服务端说服务端呢已开启了。然后呢,咱们客端呢,给服务端发的数据呢,说你好,我是客户端啊,请多多关照,这不是在上边吗。
33:03
嗯,好,然后呢,接收完以后的话呢,我们服务端这块呢,说数据接收完毕,这个接收完毕是因为我们客户端这块给关了是吧。因为你发完之后呢,你不是做了一个close吗?你一关的话呢,我们这个循这个循环的话呢,其实就结束了,我就知道你都关了,你肯定不发了嘛,结果循环就自动的就结束了,结束以后呢,结束完毕了。然后把这块的资源呢,也关闭掉。没问题啊行,这个呢,就是我们比较简单的一个叫TC pip的一个通信了。啊,这里边儿呢,稍微有个小问题哈。小,你在哪儿呢?在这块。你看为什么这块有问题啊。呃,咱们现在传输的呢,你发现的是文本是吧。而且呢,我写的还竟然是汉字啊,汉字这块你转换成BY的时候呢,是不是得小心一点。他可能会出现乱码吧。有这个风险是吧,好,我现在写的这样一些数据,我这块接收的时候呢,其实我写的这个呢,比较大。
34:01
是不是1024啊。6224呢,其实我们这个是不是基本上你看这个文字一次性是不是就读完了,所以呢,你没有发现这个乱码了,我要这块写小一点呢,这个事儿你可能就能看出来了,比如写个五。是吧,来,走起。好,服务端开启了啊,然后客户端。我们再run一下。好,然后呢,看我这个服务端你看。这个能理解吧。就这块儿我们在发的时候呢,诶这块你看我这写的都是这个,算是这个中文的,包括这个标点符号呢,也都是中文的,一个汉字是三个。三个字节是吧,三个字节呢,在存的时候,其实第一次呢,是不是就是他往外发的时候没问题,但那块接的时候呢,我们是五个一接是吧。每五个一接的时候呢,我们拿着这五个呢,是不是就在内存中还原为一个具体的字符串了。啊,那这个你好的话呢,就不太靠谱了,你呢占了仨了好呢。三个字解,然后呢,你整了俩过来是吧,这块呢,一试图呈现是不是就不行了。
35:04
这块里边凡是你看到呢,它有不是乱码的这个情况,就是因为它恰好是不是没有把它切成两半是吧?哎,恰好它在一个这个五个里边的啊,所以没事了。那这个事儿怎么解决呢?对吧。改哪个?改了一下编码,改编码怎么你也没用啊,比如这块呢,你改成说这个我用APK。这块指定JBK呢,那这块呢,顶多是一个汉字变成两个字节,这块是不是还是有可能给它拆开是吧。下边这个基数的大一点。下边也用一条杠,这你咋接受,怎么怎么设置。啊,这块这样啊,这个思路就是这个呢,其实有一个新的知识点啊,就是我们上边这块呢,其实咱们前面讲这个字节流的时候提到过啊,字节流说咱们一般呢,不处理这个文本文件。但是一般你要处理的话呢,什么时候可以呢,就是你是个复制行为。
36:03
比如这个文本文件呢,这么大,然后咱们呢,就原封不动的给他搬去,搬的时候呢,有可能这一个汉字呢,你给它肢解成两次搬过来的,但是呢,中间环境你不要试图去看它就行。就没事儿是吧,对,所以这块呢,我们可以这样的去处理一下。我们呢,还得再引入一个新的流,这个流呢,我们在上一章没讲,因为上一章讲的话,这个场景似乎大家也觉得说可用,可不用,那这块呢,我们就要用了,这个叫谁呢?我叫Barry。Output stream。哎,其实这个事儿呢,比较简单啊,这个不要把它想的很复杂,我一说呢,大家就能明白了,首先呢,我去把它拗出来哈。啊,叫你看比较长啊,BA out of stream,你看这名就是字节数组的一个输出流是吧。OK啊,那正常来讲,咱们说输入的话呢,通常咱们上一章讲是不是都得指明一个稳健啊。把它写一个文件里,注意这块不用啊。这个完了以后呢,我在这个位置呢,我不这样写了。那咱们说这个呢,是一个,呃,错误的是吧。
37:04
啊,可能会出现乱码啊好,那这块呢,我们怎么处理呢。这个呢,咱们就使用这个Bo。S是吧,第二他呢去做这个right,我们呢,就从这个八份里边把这个数据呢,取出来0L。啊,跟咱们原来一个输入流呢,写的这个方法呢,参数你看基本上都一样的啊,那这块呢,你会考虑说写到哪以前的时候呢,我们输入流会有个文件,那就写到文件里了,现在呢,他其实我们说呢说呢内部。就是我们把这个对象创建好以后啊,它的内部。嗯,他维护了一个叫做F数组。相当于呢,在内存当中啊,它这就有一个BAT数组了,我们把这个数据呢,其实就写到内存里边了,你这个数组里边了。说白了就在内存中呢,现在我们就先把它都先拼好是吧,就先放到这儿,然后呢,你这块来一个五个放到这儿,再来一个五个往这儿放,再来一个五个呢往这放,都放到它内部的这个bad数组里了。
38:05
行,那整个一个循环结束之后呢,数据是不是就全写到这个数组里了。哎,对,那下边出来以后呢,我们只需要呢,打印一下,用这个bos点,比如我们来一个叫a string。啊,把它里边这个数据呢,整个呢,就显示一下就行了。好,这时候你看我们再把这个服务端再打开。好,然后呢,再把这个客户端呢,我们打开。可以了是吧,然后回过来看是不是没问题。哎,就这样一个思路就可以了啊行这个呢,之所以这块多一个换行是吧,这个是因为咱们这块呢。诶,下边这块呢,咱们输出完以后。是我自动有个换行这块,你就主动加了一个换行是吧,诶这呢是这个原因啊好,另外的话呢,对于我们这个服务端来讲,实际上呢,这个socket这个except呢,我们可以写多次嘛,写多次呢,就意味着你可以接收多次这个或者多个不同的客户端的这样的连接了,那这我想看一看,说到底谁在连我呀。哎,其实呢,我们在得到这个socket之后,这个呢叫服务端一开启是吧,然后在这个位置呢,咱们还可以再启一句话。
39:07
写一句什么话呢?叫收到了,来自于比如说谁谁谁的连接。哎,是这样一个思路是吧,好,那这个谁谁谁呢,我们就写成IP了,咱们这个socket这呢,不就是你某一个客户端过来的socket吗。是吧,哎,它呢,里边是不是封装了一个叫ant dress啊。是吧,就是他过来的时候,其实自动的IP是多少也能够记录啊,然后呢,他的IP,呃,T address以后呢,我们再get一个叫host address。这不是咱们讲address里边的一个方法吗?哎,就这样就行,好,你看我们这时候再给它run起来。你看把客户端呢也跑起来。行,然后在服务端这块,哎,开启了说收到了来自于这个位置的一个链接。然后呢,这是他发的信息,然后呢,就接收完毕了。哎,我这个服务端开启之后啊,大家那块呢,如果你写了个客户端,就上面的代码你发过来之后呢,我就知道呢,是谁连的我了。
40:08
哎,就这个思路啊,行,在这呢,咱们关于这个7P的第一道题目,哎,这个咱们就说到这儿了,然后呢,我们接着来看这个第二道题目,相应来讲呢,比第一道题呢,就稍微的复杂一些,看下这个例题二。还是呢,在咱们当前这样的一个包下,哎,我们去新建一个程序啊TTB的TEST2。好这块的话呢,粘过来说呢,客户端发送文件给服务端了,注意这块我们发送的是一个文件了,然后服务端呢,把这个文件呢,保存在本地。咱们呢,刚才第一个程序呢,比较简单一点,就是客户端呢,只是发送了一部分的内容啊,内容我们就是直接呢,在内存里边写了个字串发送过去了,第二的话呢,这块是发送一个文件了,比如说客户端呢,给服务端呢发送一个图片。是吧,让服务端这块看一看,这个都是OK的啊。然后大家这块呢,有没有什么图片啥的比较好呢。有是吧,有可以整两张过来啊。
41:02
行,挑一挑,找大家都能看的是吧。行,这个呢,你可以发过来,然后我这块我先把这两个端咱们先创建好啊。哎,这个呢是客户端。服务端是吧,OK,没问题了啊行,静等照片啊。哎,这个你发你不是写程序法啊,你就用这个非记法就行啊,非记法就可以了啊。啊,你过来了啊,行这个。这个我就保存在这个桌面吧,这个我就写成ABC吧。这个这个格式是不是得改下格式啊。ABC加上GBD啊这个。这个呢,我得接收一下这个把类型得改一改是吧。记笔记。行啊。哎,这个接收了没。
42:03
啊,这个诶防火墙的问题,那防火墙是不是开着呢。嗯。那那咱从这几个里边挑一个吧,啊,第一个这是。品味还挺高的是吧,都是花啊。哎呀,这啥呀,这是啊,这是游戏是吧。啊。这个大家都没有什么人物照啥的吗?行,这个。嗯。人物照男性的是吧。那就来这个吧。对吧,好来它啊,这个叫default是吧,Default换个名吧,这个就叫picture也行啊。我就简写了,就它吧。好这个呢,来CTRLC一下,这个呢,我粘到咱们当前这个module下了就啊好CTRLV诶就放到这了。
43:01
这儿呢,我是有一张图片是,诶这个图片的话呢,我们从这个客户端的角度来讲呢,我们这儿呢,就属于客户端了,服务端呢,把这个图片呢,发送给我们的服务端,服务端的话呢,接收到之后呢,诶放在他自己服务端的相应的某一个路径下,诶就可以了啊好,那我们看一下这个整个怎么去写啊。跟咱们前面讲的这个tdp呢,它的第一个题目呢,整个思路呢,其实是一样的啊,第一步的话呢,首先我们也得需要呢去创建。咱们这个socket。诶OK啊好,那么创建这个的话呢,同样呢,我们需要呢,指明对方的IP地址和端口号啊没问题行,然后呢,我们就诶第一步搞定了第二步,第二步的话呢,你要往外去传输数据,但是这个数据呢,是来自于咱们本地这个文件,所以这块呢,呃,首先本地文件里边你得把这个数据呢先读过来,这块呢我们其实呢需要去创建。诶,咱们对应的首先呢,是这个file的一个实例,这呢就咱们上一章讲的啊,包括呢,我们接着呢叫file input stream是吧。
44:02
这呢,这个文件因为也不大,我就不去建这个缓冲流了啊,创建这个实例和input stream它的一个实例。表示的话呢,我们要从这个本地呢,去读这个数据了,这个对应的是它,然后呢,以及咱们这个数据呢,还要往外呢去输出,这个我们需要呢去通过。通过咱们这个叫a socket,它呢来去获取叫输出流行,还有图片啊,先放到这个桌面上。OK啊行,然后通过这个可以了,可以了。行啊。好,通过这个扫的话呢,我们来诶获取叫输出流是吧,表示呢,我们把这个输入流获取到这个数据呢,我们给它写出去,好写出去完了以后呢,我们就结束了,最后呢,我们就哎关闭。关闭咱们的这个socket和相关的流啊就OK了,这呢是我们这个客户端,然后服务端来熟悉一下啊,首先呢,第一步我们需要呢去创建。
45:03
叫server的一个socket是吧。好,然后呢,接下来。哎,这样的话呢,我们表示呢,可以接收。哎,来自于。哎,这个我们叫,诶客户端的这个socket。诶,那怎么叫接收来自于客户端socket呢,我们就调一个方法就行了,这个叫accept这个方法好,那接收到以后的话呢,我们基于呢,你来自于客户端这个socket呢,我们就可以啊,就要通过这个socket来获取,这个呢,你是发数据要给我了,获取一个输入流。对啊好,那么接着的话呢,我们还需要呢,把这个获取到输入流里边的数据呢,还原为我们自己这个啊,服务器端的相应的路径下的一个文件了,那还得要写出去啊,将在我们还得需要呢去创建。对,这个创建的一个还是我们这个file类的实例。啊,然后还有呢,我们这个就用一个叫file output stream它的一个实例。
46:03
OK啊,然后呢,上面是个输入流这块呢,是一个file类的实例,一个输出流这块就是具体的这个读写过程是吧,我们来一个第五个啊。诶读写过程这样呢,我们就把这个数据呢,从输入流里边啊,写出到我们对应的这个文件里了,保存下来了,好然后最后这块呢,我们就结束了啊,没有其他事儿了,要关闭。哎,相关的这个socket和哎就可以了啊行,整个呢,就是我们这样的几个步骤,我们先来写这个客户端吧。后段话呢,直接我们就用一个具体的叫a socket。然后呢,这块我们首先out加个回车,先创建得到一个socket行,这个socket里边呢,我们说呢,是得有参数的啊,一个参数呢叫address啊,Get by name指明了对方的IP地址啊,这个我就写成1.0.0.1表示呢,就我跟自己这个服务器这块呢进行通的啊。好这块呢,我们首先out加个回车啊,先得到我们当前这样的一个实例是吧,好这块有异常,我们暂且呢都先死肉出去,把它呢先扔进来。
47:07
牙吃一个啦,然后还得有一个啊,叫做part端口号就是9090。哎,这个我们在这逗号一下叫做port啊,然后这个位置呢,我们在这里说清楚说叫指明。哎,对方的啊,对方呢,其实呢,就是极为。对服务器端。哎,那。IP地址和端口号。行,这个呢我们就指明了,然后这块呢,有异常,暂且呢,我们也是此如此出去啊好,那么这块我们就得到一个socket了,然后下边的话呢,我们socket呢,正式来讲呢,你是要输出数据了,所以拿着这个socket.get output stream这在就往外去写这个数据了,但是这个数据的话,我们说呢,来自于本地的一个文件了,所以呢,我们还需要把这个file呢给它创建出来。哎,你一个具体的一个file。这呢,咱们写的是一个相对路径了啊,用的是这个地址啊好这块我们回过来呢,就粘过来。
48:03
接着啊,File input stream。哎,用一个I file input stream,然后把我们这个file呢,就诶写错了,是file input stream啊然后呢,把我们这个file呢,就放进去啊这就妥了,好,那这时候呢,一个输入流得到了,一个输出流得到了,下边就我们可以呢叫哎读写数据。OK啊,这呢,我们还使用一个be数组吧,本身这个图片也适合用这个be数组,比如1024。啊,印的一个LN,整个这个套路呢,跟咱们上一章呢是一样的啊。这个F fi.read到我们这个八伏当中,哎,然后不等于负一啊。好,那么接下来的话呢,我们就通过这个OS点去write出去,把八份中的数据呢出去啊,你读进去几个呢,我就写出去几个,哎,所以这块呢是0LN没问题。整个呢,我们就把这个数据呢,就读写了。哎,最后完事了,关闭相关的socket和相关的这个流啊,这块在关的时候呢,其实有个小技巧,大家呢,你就从下往上看哈,你看遇到哪个资源就给它关哪个资源就可以了。
49:06
呃,先出现的,比如说OS啊,我们就先关下它,然后FS,哎关下它,然后sock哎关一下哎这就可以了。行这呢,就我们说的这几个步骤啊,这就搞定了啊行这个呢,咱们比如说把它呢改成一个四吧,这个呢就要五了是吧。好,这呢就是我们整个这个过程,然后呢,需要稍微注意的话呢,此时的话呢,咱们这个异常是不是仍然需要使用check开family是吧,这呢我就不调了哈,诶我就用这个ROS,大家呢,这样更清楚的能看到这样的几个步骤。哎,但是这块我要明确说一下啊,注意哎说呢,因为涉及到。诶,相关资源的一个关闭,哎,所以呢,需要呢使用。Try catch。Finally来处理一场是吧,这个呢,我就这样写一个呢是省事了啊,另外一个呢,就是大家呢,也更清楚的能够看到这样的一个流程啊。
50:01
啊,这个完了以后,嗯,咱们要是愿意在这儿写一句话呢,也行。客户端这块呢,我们可以呢,叫数据发送完毕是吧,OK了。然后呢,接着我们来看这个服务端哈,服务端的话呢,首先我们就直接呢,一个叫server socket了。好,然后呢,这块呢有个参数啊,这个参数呢,我们还需要去填一下ctrl alt加一个回车,这不就上去了吗?啊int的一个port,这个呢,注意其实是我们这块先写的这个写完之后的话呢,你在客户端这块呢,你写跟我这个服务端去一致的啊OK 9090,然后呢号一下。哎,这么着out,加一个回车,哎,Serve socket这就有了啊,异常呢,我们就Rose除去啊。好,那么得到这个serve socket之后呢,拿着唯一的这个socket,我们再去调一个叫accept这个方法。哎,这个我们就接收为一个具体的socket,这呢就来自于客户端这个socket我就拿到了。啊,拿到了,拿到以后的话呢,我们要从他这里边儿呢。
51:01
诶,建立一个通道了是吧,我们要获取一个input stream,因为我们现在服务端的要接收数据了。啊,这就返回一个input stream啊就is了is了,然后呢,它这个数据呢,是一个图片文件,我们把它呢,再保存到咱们服务器端的这个本地的一个目录当中,所以这块呢,我们也需要呢,去创建下边这个相应的实例。哎,这么着啊好,那这块呢,嗯,咱们这儿呢,因为写的这个程序呢,都写到这一个里边了。啊,写在一个里边了,那我这块如果也用一个相对路径的话呢,实际上呢,你知道呢,它其实不一定是在一个地方地方啊。嗯,OK,行,这儿呢,我就我也起个名。啊,就放这了啊,然后接着这个我们要给写出嘛,叫out啊。哎,Output stream,然后把我们这个file呢扔进去啊,这呢就可以了啊好,下边的话呢,我们需要呢,把这个输入流里边这个数据呢写出去,就是一个读写的过程,这呢还是字节嘛。
52:03
哎,比如这个还是1024哈。哎,这个套路呢,跟上面一样。嗯,is.read哎,到我们这个八伏里边不等于负一。哎,回过来这呢,就fos点出去。从buff里边数据0LN,诶没问题。OK的啊好,然后这块呢,我们操作完以后的话呢,除了这个循环,意味着我们这个文件呢,诶对应的就诶完成了,完成以后呢,这块啊,你可以呢,也写一句话啊叫数据呢接收完毕。哎,数据接收完毕,好,下边的话呢,我们就关闭相关的资源就可以了,还是呢,从下往上这个顺序,你看一看啊,都有哪些相应的资源,该关的就关一下。呃,首先比如说fos。第二,Close一下。这个is点一下是吧。As close一下好,上面还有一个叫socket是吧。
53:01
哎,Socket点,哎CLOSE1下行,然后还是呢,我们说的这个叫server,这个socket在咱们这个练习当中呢,我就给关了。在实际当中呢,这个服务器端呢,可以一直呢开启着啊。好,这呢是我们说的这个呼吸端。那这就完事了啊,这完了以后呢,那下边的话呢,我们就开始呢要运行了,运行的话呢,还是得先跑这个服务端了是吧。把它呢,先抛起来。好,这时候我们在这儿等着呢啊,此时呢,就阻塞到我们这个这了是吧。就等待接收呢,啊,然后呢,我们这个客户端这块呢,我们给它乱起来。然后呢,客户端这块呢,我们这块有一个呢,叫数据发送完毕,数据发送完毕好了,然后呢,我们服务端这块呢,过来数据接收完毕啊,这就都是正常的这个情况没问题好了,那这一块呢,我们回过来看一下,这不就多了一张。图片了。哎,这个我们回到这个物理磁盘这个位置,我们看看它们的这个大小啊。
54:02
诶,这个呢是原文件啊,我们先看看它的大小。哎,这是这个大小。然后呢,我们把这个呢,复制过来的这个看一下。诶,你看完全这个大小呢,你看是一样的,那说明我们这个复制行为呢,是没有问题的,哎打开呢,看一下这个也是OK的是吧。可以啊。好,这的话呢,我们就实现了一个数据的一个传输了,把这个数据呢,发送给我们这个服务器端啊这呢是我们自建了一个服务器端,自建了一个诶客户端。OK,没问题。哎,这个呢,大家考虑考虑啊好,这个完了以后呢,顺带着哈,咱们把这个第三个题目呢,也说一下,可以理解成是在第二个基础之上呢,我们多了一个操作。来看一下。哎,这个我们叫ATTP的一个test,我们写个三啊。把这个呢需求粘过来,这样说呢,从客户端发送文件呢给服务端,服务端呢保存到本地。
55:01
这个单我把这几个就先先关一下它就啊。诶看这啊说呢,从客户端呢,发送文件呢,给服务端,服务端保单本地,刚才我们就这样做的,在这个基础之上呢,说并返回发送成功给客户端,并关闭相应的连接。多了一个需求。所以呢,我们可以呢,在刚才这个二的基础之上。哎,我把这个呢,先原封不动的呢,CTRLC咱们复制过来粘到这儿。行啊站到这儿,哎,上面这个图片的话,还是它下边这个话呢,咱们稍微改一下,我叫COPY1吧。诶,换一个文件名啊,那我们在现在的这个基础上呢,我们看如何呢,去增加这个需求了。哎,目前的话呢,上面这个客户端,呃,发送发送发送到这儿,是不是发送完了。搬完了,我们前面呢,就直接关了啊,而目前的话呢,这个服务端这块接收接收接收接收呢,是不是就完毕了,然后接着的话呢,是不是还得有点。做法是吧,是不是这块得补一个六的操作。相当于我们这块呢,服务端是不是要给客户端的发点东西啊。
56:03
哎,这个我们写啊服务端。诶,发送这个数据给客户端。啊,这呢是一个需求,然后你再关闭这个资源,哎,那我们就从这儿开始写吧。发送数据回去,那你是不是还得拿着这个OK的呢?Get一个output对吗?对于服务端来讲呢,你现在要往外输出了啊,所以呢得调这个方法,然后这块呢,我们就得去做一个接收output stream啊OS。哎,拿到了,然后呢,你往外写什么呢,这个咱们写个OS点,比如right一下。说的哎,你的图片啊。嗯,很漂亮是吧。哎,我接收到了。好,这么着呢,我们再get一个代,哎,这不就给大家写出去了吗?没问题吧?把这个写出去之后的话呢,我们最后这个资源关闭的时候,也得考虑把它呢给close一下。哎,这个注意了啊,得给大关一下。
57:02
完事了啊,然后这个呢,发过去之后呢,我们的这个客户端这块呢,你同样的是不是得接收一下啊。呃,接收的话呢,显然应该是在关闭之前哈,是不是在这个位置。这个呢叫接收。来自于诶服务器端的这个数据。哎,这样,然后最后呢,你这块呢,再关闭相应的这个资源就可以了,好这块呢,表示呢,你是来接收的哈,那接收的话呢,这块我们应该还是拿这个socket点盖一个是不是叫input stream。Input这个stream啊,好,这块我们接收为一个叫is。嗯,接收的这个数据怎么弄。怎么写?啊,有些任偶来一个BAT的一个数组while一个循环,这个呢,我们在讲第一道题目的时候呢,说过这个事儿啊,这个其实的话呢,还有可能会出现这个乱码的情况是吧。但是咱们用了一个。
58:01
Battery output stream吧。哎,这个是吧,哎,Bos啊,然后呢,你一个battery output stream,哎,咱们再用一下啊。哎,这块为啥要用它还记得吧。对不是为啥要用它,是因为咱们这块你看你要自己呢,首先咱们这个读数据呢,你肯定是先有个B是吧。比如这个BY的话呢,我这就写了个五,然后呢,你看咱们那会儿写的时候不是这个问题吗?这块忘了一个变量了。是不是先印那个L音是吧,然后这个L音的话呢,咱不是从这个is里边呢,把这个数据呢,读到咱们这个buff里边。然后数据呢,返回的长度呢是L,然后呢,这个位置呢,如果你要是拿这个string去接收的时候。哎,这个位置呢,是不是有可能会出现就是乱码是吧?因为你把一个汉森呢,可能就劈两半了,这一次呢,一半呢是在这个数组里边,然后下边一半呢在下个数组里边,那么这一半呢,你非得要转换成一个字符串去看,这不就可能乱码了吗?
59:02
所以不行是吧,哎,是基于这个原因哈,那怎么办呢?这块我们就提到了,说你再去使用这个叫battery out of the stream啊。哎,这么着,它这块呢,实际上是内部呢,维护了一个BAT的字节数组啊,所以呢,你不用指定说写出到哪儿啊,以前我们都是写出到一个文件里了啊,这个呢,直接写到内存里了。然后呢,这块我们还是这个while啊,LN等于s.read到B当中,然后不等于负一。啊过来,然后呢,通过这个bos点我们去write,把八分钟的数据呢,哎,就写出到我们内部的这个字节数组当中了。就写到数组里了,所以呢,你一开始的话呢,假设过来的时候,这个五个字节里边这个,比如中文的这个中,你就是劈了一半了,那剩下的你再来这个B的时候呢,我们这不就给你接上了。哎,还都接到你整个这呢,就是我们在这个数组里边的。啊,然后呢,整体啊都传输完毕以后呢,我们再去看一下整个这个数组,这个数据是多少,是不是就能接上,就不会出现乱码了啊。
60:05
所以呢,出来我们这个循环以后呢,我们这个诶bos点我们去做一个toth,这呢,就能获取到它里边完整的这个数据了,诶我们打印一下。哎,这样的一个思路啊,好,这个buff呢,跟我们这个less呢,上面已经定义过了啊,咱们换一个名BUFF1。Al尔法一是吧,哎,LS1,哎L1是吧,这样个思路啊。OK吧?啊,回忆一下啊好,这个完了以后呢,最后我们再来把相应的这个资源呢,给它做一个关闭哈,这个关闭的时候呢,你看一下啊,从下往上走。哎,bos.close。is.close多了俩是吧?上面这块呢,应该是都关过了啊。行没问题啊,这块流呢稍微的多一些。可以了。可以了,咱们现在呢,要做测,要做这个测试了啊。诶先回忆一下我们都刚才做什么事了,就是呢,这个服务端这块接收完毕之后呢,我们多了一个发送。
61:02
然后呢,这个客户端这块呢,多了一个接收。啊,最后资源呢,关闭一下,这是必然要做的啊。那首先呢,我们把这个服务端呢,咱们开起来。嗯,开起来了啊,开业以后呢,下边的话呢,我们把这个客户端这块呢,咱们也给它抛起来,大家注意看啊,这里边儿呢,目前存在一些问题,看这问题呢在哪啊好走起。调解以后呢,注意看啊,我们这个客户端这块呢,它这块显示呢,叫数据发送完毕,数据发送完毕是吧,但是它这块你看没有结束啊。因为我们这个服务端不是要给他再发过来数据吗。没发过来。没发过来呢,有可能是卡到他这儿了。也可能是服务端的根本就没发是吧。那我们看服务端这块呢,问题在哪,点开服务端。服务端这块你发现呢,啥也没出来。服端这块我们看这都有啥啊,这块呢服务端过来,然后呢,这儿呢,是接收了一个客户端了,这应该是没啥问题。
62:04
嗯,应该是接触到了。当然这个呢,也有风险是吧。啊,也有可能没接收的啊,然后下边往这走,往这走往这走,至少的话呢,这句话是没出来的。是吧,这句话没出来,那这句话呢,要是没出来,你后边这个肯定是不靠谱的了。就是我们客户端这块呢,你看他是认为发完了。然后呢,我们服务端这块呢,它这个没有执行,就意味着我们现在呢,认为没有接收完。然后呢,后续的这个呢,发生这个事儿呢,自然而然就没做,所以呢,客户端在这等着也是很正常的。那现在这个原因呢,应该是从服务端这块呢去找问题了,当然了大家也可能说说你这个服端接收这个客户端,这有可能就没接到啊有这个风险,但是多少这个代码咱不是从前一个粘过来的吗。粘过来的咱也没有动,前边其实呢,前边这块应该是接收到了。大不了大家你就在这个位置呢,你你写一句话,你看诶说接收到了来自于客户端socket,你看执行成功没有。
63:04
其实呢是能成功的啊,那这个问题呢,在哪儿呢,大家看看。这句话没结束是吧?他认为我们这个这个要没执行结束,认为我们这个循环相当于是不是就没出来呀。这个为什么循环没出来呢?而我们这块呢,你看他已经说发送完毕了是吧。这个没出来。咱们刚才写这个二的时候呢,你发现呢,怎么也没出现这个事啊,三三的时候咋就出现了呢。是吧,诶对有同学发现这个原因了啊,就是我们这个二在写的时候呢,咱们在对于这个客户端来讲。咱们在这个客户端里边呢,咱们把这个数据呢,这不是发送完毕了,发送完毕以后呢,紧跟着呢,咱们这块呢,就写了一个关闭。因为你这个关闭操作,尤其是这个socket这个关闭哈,服务端呢,就非常明确的知道呢,我接收完你这个文件之后呢,你给关了,你关呢,我自然而然就知道呢,你数据诶不再发了,所以呢,我服务端这块呢,就会执行这句话叫数据接收完毕了。
64:14
因为你关闭了。而现在的话呢,我们这个的话呢,我发完数据之后,我确实也说发送完毕了,但是我没有关。我还等着你接着再发给我数据呢。所以这块呢,其实我们呃这个没有关这个socket呢,导致呢,我们这个服务端呢,就认为说你可能还会发是吧,所以呢,我们这个呢,就没有出来这个循环,他没出循环呢,这个呢就没执行,所以卡到这儿了,那这个你拷到这儿呢,我们也确实没有发数据,导致我们这soer呢,也确实一直关不了。有点像那个死索一样是吧,互相僵持着呢,那走不动了就。哎,就成这个问题了,那我们怎么去解决这个问题呢。其实应该是对于我们这个客户端来讲呢,你应该告诉一下服务端,比如说你这块发完了是吧,你告诉他你说我不发了。
65:04
然后这块呢,哦,那我知道你不发了,那我这块呢,我就退出我这个循环得了,哎他呢,只要往后走,后边儿这个事儿呢,就都解决了。注意啊行,那其实咱们自己知道呢,这个图片实际上是不是也传完了呀。呃,只是说呢,他不知道客户端呢,是不是还要传,所以呢在这儿始终呢等着呢啊,但是你看啊,我现在呢,把这个客户端这块呢,我给他断掉。客户端要一断掉了,服务端自然而然的就也知道你不再发了嘛。断了以后呢,你看我们这个文件呢。哎,我这呢叫COPY1,你说他有没有。你看是不是这时候有是吧。哎,这个文件正常不。其实也是正常的,其实你本身就发完了是吧,哎,只不过呢,就是不知道这个客户端是不是还要发其他的数据,所以呢,在这块等着呢。啊,这个注意一下啊好,那么怎么办呢?回过来咱们在这个客户端呢,你发送完毕之后呢,这块我们多讲个方法,诶表示。
66:03
啊,客户端。表示或者叫表明。哎,表明是吧,不在呢,呃,继续。哎,发送这个数据了,所以呢,我们这儿呢,使用这个socket,咱们呢叫,诶给他呢叫。啊,关闭一下我们这个这个输出是吧,这个叫杀当output。啊,关闭一下这个输出,相当于呢,我就不在呢去输出了,那你关闭输出之后呢,自然而然我们这块呢就知道了,说你不在呢去呃输出了是吧,我这块呢,就出了我这个循环了。但你上面还不能关闭我们这个socket啊,因为我们这块呢,还要接收嘛。哎,所以这样啊,好这呢,我们只需要呢,补充这样一个方法,其实就可以了。啊,那这块我们把它的不妨呢改成是一个叫二了。OK啊行还是呢,把我们这个服务端呢,给他提起来。哎,上面这客户端给他那也提起来。
67:00
诶你看整个这个事儿呢,就结束了,这个客户端这块呢,说发送完毕了,然后服务端这块呢,他也接收完毕了,他呢也给客户端发数据了,客户端这块呢也结束到了。啊,也没问题,然后这个图片的话呢,你看也没有问题,哎,我就不看它大小了啊,这个其实也没啥问题,这个呢,就是我们这个题目三的一个,哎写法啊。好,这几个话呢,大家就熟悉熟悉啊,写写就行。
我来说两句