00:00
成,那这个呢,清楚以后,下边呢,我们就开始具体的针对于传输层的TCP的协议还是udp的协议进行网络编程了,首先呢,我们讲叫TCP的网络编程啊,这块呢,我们就通过几个例子啊来讲一下,新建一个哎class叫TCP的,哎这个TEST1啊啊这呢我们就写一下说呃,实现TCP的网络通信协议。或者叫TCP的网络编程。嗯,这呢我们是一个啊例子一,好,刚才呢,我们提到一个问题,就是说TCP的话呢,通常诶我们具有的两端呢,一端呢叫客务端,一端呢叫服务端,哎那这呢,不妨我们在咱们当前类中就建立两个单元测试方法,哎,Public avoid,这呢我就叫做client,哎让他呢来充当咱们的客户端。再新建一个呢,叫做服务端。
01:00
不叫做。哎,客户务端,哎服务端啊,那现在呢,咱们做一个什么样的例子呢?我们说这个客户端,哎,发送一句话给这个服务端。哎,客户端发送这个信息给服务端,哎,然后那个服务端。哎,将数据。哎,将这个数据呢,显示在咱们的控制台上,行,就做这样的一个事情,那咱们首先呢,先写客户端吧。那客户端现在呢,要发数据,这是他做的这样的一个事情,呃,就像咱们这个之前第13章中去讲这个IO流一样,呃,咱们呢得有一个本地的一个文件,这呢用不着本地文件了,咱们就直接在内存层面呢去写一句话了啊,接着我们得有一个流啊,这个流呢你往外去输出。哎,那这呢也是一样啊呃,首先呢,我们要往外输出,你是想给服务器端发的,你得知道服务器端它是哪个IP啊,包括呢,它是哪个端口号,都得需要指明那服务器呃,IP和端口号,咱们刚才讲它的时候呢,提到了封装为一个叫socket。
02:15
所以现在呢,我们在这个客户端其实呢,就创建一个socket,哎里边呢就包含具体的IP和端口号了,哎,所以呢,我们这呢先socket so等于你一个,哎,我们就叫做so。哎,Socket行,哎这样呢,去造一个啊,那造一个socket以后ctrl out斜杠这呢提供了很多带参数的构造器,我们考虑一下应该用哪一个。我们说一个骚当中典型的是不是包含一个IP,还有一个端口号吧,对啊,你要用这个其实也行,这个呢,就是只是取了它里边的具体的那个地址了啊,其实本质上来讲是一样的啊,就像我们说一个文件,你这写个文件或者写文件的路径啊,一个意思一样啊,那这里边我们就指明一个I ne address,哎,我不妨呢,就写到这个上面了。
03:17
诶不是直接拗了,咱们说调它的一个方法get by name,那这呢,我要写一个IP,这个IP是不是应该指的是谁的IP啊,是自己的还是说对方的呀?诶应该指明是对方的啊对方呢,咱这其实也是本机了是吧?哎,我就写127.0.0.1了啊这呢是我们,因为咱们现在操作的不就是它嘛,嗯,诶跟他家去连,呃,我这呢把I net ctrl c我就放到这后边呢,需要写个端口号,端口号就是你到底想跟本机上咱们可能有很多的进程哈,你跟哪个进程去这个数据通信啊,诶这呢,我们服务器端的一个端口号,假设咱们提前写上了哈,啊88899。
04:08
啊,一会儿呢,咱们指定它的时候呢,相当也得指明这个断符号了。行,这呢,我们就造好一个具体的socket啊,有异常暂时呢,咱们先给它做一个roses啊,那有了这样的一个socket以后,我们这个socket的话,主要呢,要传输数据,诶我们通过它呢,可以调个方法叫get output stream。那只要看到这个流了,大家呢,是不是觉得就简单多了。拿到流了,你现在不就要往外写东西吧,哎,那咱们就OS,哎点right,哎点right呢,因为你这是一个字节流了啊哎咱们就简单一点,直接呢在这块写一个说呢,哎你好,哎我是呢啊客户端啊嗯美眉是吧。哎,然后点啊get一个BAS,这就出去了。啊,这个发出去了,这块呢,是不是就该接了呀。
05:03
哎,就这样啊,那这块呢,发完以后也没别的事了,按说呢就没事了,就完事,但是你别忘了这个你发出以后呢,像我们这个socket啊,它其实也是一个资源啊,类似于我们说的这个流一样。哎,端口号太大了。6535啊,是整兴奋了是吧?嗯,超过6535了啊,那这个我们写的小一点啊,行,那么这个把数据发送完以后,这块呢,要记着资源也要进行一个关闭。啊,资源也要进行一个关闭,那资源关闭的话呢,一方面咱们这个流做一个close,那另外呢,我们的socket啊,大家也需要做一个close。哎,这要注意啊,Socket呢,也不会自己呢进行一个关闭了,所以要我们显示的去close,那要1CLOSE这个是不是就不能close close了,不能这样写了啊,所以我们把这呢就得包一下out shift z哎在这个finally里当中,哎分别呢去关一下我们的这个iOS。
06:13
哎,还有我们这个socket。你这样子啊,然后al enter,哎,再去try catch,我们这样一个异常。好,这呢,我们就写完了。诶写完以后,然后接下来我们看下这个服务器端,服务器端的话呢,它是能够接收来自于客户端的数据的啊接收数据或者叫操作数据,你那呢叫socket,我这呢也叫socket,只不过呢,我叫哎叫server socket,哎造的是server socket那ctrl alt斜杠。Server它也有参数,我们看看用哪个。哎,其实第一个就可以了,对于我们这个服务器来讲呢,你只需要指明自己的端口号啊,因为他想给8899传,哎,我就是8899。
07:10
那其实是先有他啊,后有的他。对吧,你先得知道人家服务器是多少啊,只不过咱们后写的,所以诶是后写它了,其实是先有它,那有我们这个server socket,这呢,此时先把这个抛一下啊,哎,Al生成我们的一个叫server socket,我就简写成SS了啊得到这个叫server socket,这个server socket呢,哎,我们接着要调它的一个方法叫做accept,哎,这个呢,表示我们可以用来接收来自于客户端的socket。啊,一会我们把这个过程呢来注释一下啊,拿到这个socket以后,那我们呢,又可以调一个方法叫get output还是input呀,你是不是现在要读入啊,哎,就叫input了,这呢我们就得到一个is了,行,拿到一个流以后,这个大家其实就又放心了。
08:04
咱们上一张就是来操作流的,现在我们想把这个流中的数据呢给它,呃,显示到控制台上,接下来怎么做呀。对,肯定是read了哈,但read的话呢,有可能人家客户端发送过来数据比较多,你一个字节数组搞不定了,这个循环要写循环呢,是不是又得是写一个什么呀,FT数组吧。哎,New一个bet,这我写个比如20,哎,Int一个Le。哎,等于S点,哎,Read到我们这个八当中,哎,不等于。负一,哎这个我就忽略了啊,诶不等于负一,然后这里边怎么办?本身呢,人家发过来是文本,其实这块呢,是不是转成一个string呢?诶new一个string buffer,然后0L音,这呢,我们把它输出到一个控制台上。
09:08
哎,把我们S2呢给它出来,这个呢换行就不要了。哎,就这样搞定是吧,但是这样写法呢,大家要注意,其实有点问题啊。有什么问题?嗯,写汉字,诶对,写汉字的话,这个不就相当于咱们用的是字节柳然,然后呢,这块我们写的是这个,呃有中文,那有中文的话呢,咱们知道你要UTF杠八这一个呢,是占三个字节是吧,那我这儿呢用的20,但是你要怕出现这个可以整的大一点啊,但我要这块就写了个五。相当于他一个呢,就占了仨,这个呢,是不是就劈两半了,一个劈两半了,然后你就拿着这五个呢,非得还原成一个string,这不就出问题了吗?这不行。怎么办?
10:02
怎么办,那就这块是不是整个大一点的。整个大一点的这个超不了了,但是呢,那你你大它更大。是吧,哎也有这个问题,哎这块呢,咱们就当然在咱们这个里边呢,大家把这个变得大一点,因为咱们当前这个数据不多嘛。哪怕你写个1024,上面那几个字符肯定是能存得下的啊,但是咱们呢,是不建议大家这样写的。哎,不建议啊这样写啊,因为呢,就是可能会有这个乱码啊,诶你知道这原因,那么咱们怎么写呢,上午呢,咱们提到一个类啊,我没有去写,就是那个be array outut stream。这个上午咱们讲的时候呢,这不是我引入了一下,说大家呢,你可以下来呢,用它改写一下咱们写的那个代码。哎,咱们讲r access file的时候插入,哎,当然提到它了哈,那这块呢,我们演示一下它的一个使用,哎,我呢可以去创建一个叫哎,Be。
11:03
哎,Array,哎,Output stream啊,BA,哎,等于new一个,哎,Be a ray,哎,Output stream,这里边的话呢,我们就不用指定任何的一个文件了,那接下来还是去造一个buffer,这个时候呢,你造一个短点的都无所谓,然后写一个五哎都可以啊,In特一个L音。L1呢,就等于哎,我们是叫is.read到我们这个B当中返回一下,读进去的字节的个数不等于负一的时候,我们boos。点,诶,我做一个right,从我们这个buffer当中把数据取出来,写个零,写个L。可以了。说这个数据到底写到哪了,是不是这也没有像原来的流一样指定一个文件,诶这个呢,就写到我们这个类啊,它里边呢,放了一个数组。
12:00
啊,它放了个数度,就是你只管往里写就行啊,不够的话呢,我会自动往外扩,此时这个数据你像咱们刚才讨论的那个问题,呃,咱不是担心的说把一个汉字就劈两半了,劈两半呢,你在这块呢,就紧接着去还原成字符串了,这肯定有问题啊,现在的话呢,我就是呃,你五个,那我就放在这儿啊,又来五个又放这儿,我现在都不会把这独立的五个呢还原成一个符串,我就先给你拼着,等你这块都输入完以后,我整体上把你转化成一个字符串。啊,它就不会出现乱码了,所以在后边我们呢,怎么做呢,我就c out baos,点第二个to string方法,就把它内部的所有的这个字节啊,这个数组啊,直接呢,转化成一个字符串了。哎,这样的话呢,就不会出现乱码的问题啊OK,这样的话呢,我们就把这个数据呢,给输入到这个控制台上了,那输出完以后。是不是该关闭这个资源了,关闭资源这时候呢,考虑一下都有哪些资源需要关,其实大家从下往上看就行啊,这个是流得关吧,点close一下。
13:09
哎,再往上是不是is。哎,这样关一下再往上,So,哎,他得管。哎,再往上哎,Server socket也得关,哎,当然前提是我们这个服务器这块你你不想去接收了啊,诶我们就也给它关掉,这呢是所有的这个资源行,那既然呢涉及到这个资源的关闭,保证它呢一定会被执行,所以呢不能用Rose啊,又得把这块呢整个包起来。到这块啊,Out shift z。那下边下边这块写起来就稍微这个悲壮一点啊四个。哎,If啊bos点哎点啊不等于no。
14:07
Socket它呢,还不等于not。行,那一个一个的话,我们给它粘过来。哎,这个事呢,其实不复杂,就是比较繁琐啊。那接着呢,我们对每一个呢,进行一个拆开。整个这个代码量呢,相当于就多了一倍啊,啊主要代码都在写这个翻这里了啊行回过去啊,我们看一下整体的过程呢,其实就搞定了,那搞定以后大家想此时呢,我想去执行了,看看这样一个效果是不是能够完成啊,那你想先启动谁。服务端服务器啊,客户客户端啊服服务器对服务器了,你要客户端这块一启动,他就先去建立连接了,发现服务器那块没起起来是不靠谱了,诶所以我们得先把这个服务器起起来啊,服务器呢,一般属于这种被动的一端啊,就是它起完以后呢,就是等着这个客户端去连了好我这块呢就起起来。
15:21
那起车的时候呢,我们现在呢,通过这个客户端呢,现在去做一个连接啊执行。哎,你看这会儿就结束了,这呢有两个啊,Client这块呢,没有任何的这个输出的数据,我们看下这个server这块。哎,这不就把数据呢,发送给我们这个server这一块了,哎,我是客户端美眉是吧,哎这样的话呢,我们这个数据呢,就接到了。啊,就接到了啊,哎,这个呢,你注意一下,就是我们这发送的是给这个对方发的啊,你看我写这个行不行,19216814.100。要。192.168.14.100。
16:03
哎,接着再重新连。你看是不是也是可以的呀,啊也是可以的,那要这样的话呢,大家其实你就想啊,哎。你看你旁边这个兄弟,然后呢,他可以写一个服端,你呢可以写一个客户端,你呢是不是就可以连它了。哎,就可以连它了啊,然后你记着,诶你先问他说你那个端口号写的多少,哎,当然这个IP的话呢,你直接从这都能找到它是吧?哎或者他自己也知道啊,诶你找到这个IP以后呢,你问问他的,呃,写的服务器端的端口号是多少,你呢,是可以把这个数据呢发给他的,那发给他以后呢,他在这看到了,他会想,诶这是谁给我的,说我是客户端美眉,当然咱们班女生不多啊,嗯,这就那几个,这个一个一个问问也知道是吧?嗯,那么我们想在服务器端你想看一下,诶这是谁给我发的,怎么办呢。
17:00
诶,在这个位置,在这个位置呢,我们可以写一个c out啊,咱们呢,不是接收客户端的,这个叫socket吗?哎,这个socket我们可以叫get,它的一个叫I net address啊,就是获取它的IP了,然后get一下,嗯,你想看什么呢?你要看这个地址的话呢,就是host address呗。哎,所以你可以这块写说呢叫收到。收到了啊,来自于。啊,谁的数据。诶,它的一个数据啊,这个我们诶用它也行啊,加上一个冒号的数据,行就这样子,那下边呢,我们把它再重新跑一下。啊,这呢,就服务器端,那他就一直等着我们这个客户端去连接。啊搞定,然后看这诶收到了来自于啊这这因为我是本机测本机了啊这个呢,其实是我们这个客户端的这个IP。
18:00
啊,就是这块的一个IP啊,恰好呢,也是我们服务器端,因为我是自己连自己的啊,这样的话,我们就经常建成了一个通路啊,实现了一个TCP的一个通信啊,这个通信当中我们总结一下啊,有这样的几个步骤,首先第一步。哎,我们呢,需要去创建哎,Socket的对象,咱们说呢,哎TCP的网络编程,包括呢一会儿我们要讲的udp的网络编程,其实都可以叫做啊socket编程,因为呢我们用的都是socket,哎先呢创建一个socket对象,然后呢,这时候指明啊服务器端啊服务器端的这个IP和端口号。哎,这是第一个点,那指令完以后这个第二步,哎,我们呢,相当于是哎获取一个输出流,哎用于这个输出数据。行,然后呢,你获取输出流以后啊,接下来你就拿着这个输出流呢,具体的去写出数据啊,这个操作这就完事了啊,最后呢,就是资源的关闭啊,应该说呢,很好理解啊,啊这是这样的四步,那么对于我们这个服务器端来讲,实际上这个步骤呢,跟它基本是也是类似,稍有区别呢,就是刚开始我们这块呢,也是socket,只是呢,我们创建的叫server socket创建。
19:29
哎,叫服务器端的socket。哎,Socket我们只不过呢叫server socket这个呢是指明自己的端口号说,诶你怎么不指明自己的一个IP呢。为什么不指明自己IP了,你自己跑起来,你自己IP是多少,你自己不清楚吗?是吧,你跑起来你在哪个主机上跑的IP,那就是多少啊,就不用指定了,你指定了,你指定一个不对的,那还能按新的呀,也不可能啊,所以说呢,诶这个就是默认有了,这是第一个,然后第二步。
20:07
哎,第二步的话呢,就表明啊,可以接收叫调用啊,咱们这个叫accept的方法。哎,调用这个方法呢,哎表示呢接收,哎来自于客户端的socket。诶是这样子,那既然进收到来自于客户端这个socket以后,嗯,下边我们这个第三步呢,那就是来获取一个输入流。那获取输入流以后继续呢,我们从输入流当中呢,去读数据啊,那么就是读取啊,这个输入流当中的数据。哎,我们就接受这个数据了,接受完以后呢,你此时你想干什么,你想这个C的显示啊,还是想着去装配啊等等,那就是你自己的实际问题的事情了啊,第五步呢,进行一个资源的关闭。啊,就是这样的一个过程,哎大家呢,熟悉一下这样的一个过程,那举一个生活中的场景呢,其实也很好理解啊,哎大家比如说呢,这是一个岛,这是一,哎哟哎,这是一个导,这呢是一个,这个导呢叫做客户导,客户导或者叫客户端导,这个呢叫服务器端导。
21:18
啊服务岛啊简写了啊,就这个岛这个岛,然后现在的话呢,这个这个岛的话呢,想把这个它的一些生产的这个,比如说这个农作物产品啊,想运到这儿啊去买卖,那他这个过去中间这都是水,那这块呢,他得整个小船。这个小船相当于谁呀?对,就相当于咱们的socket,那这个船呢,它里边啊去这个装这个东西啊,这个socket呢,它发出来以后,它得知道呢,我们想去把这个船开到哪儿,可能这是个岛,还有别的岛呢啊,我得指明啊是这个IP,所以呢,你就诶往这块运这个IP过来以后的话呢,人家这个岛这块呢,海岸线有好多的这个港口,你到底这个船是想停在哪儿啊,就指明具体的是一个IP,呃这个端口号对端口号,那那么对于我们这个呃服务器端来讲,这块呢,首先我们这块也建立一个叫s socket,有点像这个就是港口一样啊指明呢,我们这呢是8899,我这个港口呢,就是8899这个号,哎,我可我可以来接收。
22:19
你从这个客户发送过来的一个船啊,一旦接收到以后,哎,我就哎获取一个输入流,哎,把你这里边这个数据呢,就获取了。啊,最后呢,把这些资源现在的都关闭一下。可以这样的一个场景呢,稍微去体会一下啊呃,写这个代码的时候呢,可能就会稍微轻松一些,行,这呢是我们写的第一个例子。
我来说两句