【Java】基础45:网络编程代码演练
今天是我自学Java的第45天。
感谢你的观看,谢谢你。
话不多说,开始今天的学习:
image
昨天学习了网络编程里的少量基本概念,今天开始代码实战演练,写一个TCP通信程序。
一、前提概述
TCP是有连接的通信协议。
1.既然是通信,那必需有用户端和服务端,毕竟一个人也没法通信。
2.用户端先发起请求,还记得昨天说的三次握手么?
用户端向服务端发起请求
服务端响应用户端
用户端再次发起请求,发送确认信息
3.服务端和用户端哪个先运行?
答案是服务端。尽管说三次握手中是用户端先发起请求,但是用户端发起请求时要先确定服务端能否存在。
就好比我们打电话结果对方是个空号,那不是白打了么?
所以要先启动服务端,保证它不是空号。
二、用户端代码
创立一个用户端类:TcpClient
image
①用户端套接字
什么叫套接字?
就是IP+端口,在Java里面它就对应了一个类,叫Socket,也叫套接字。
通过它可以找到计算机中对应的进程。
构造方法中的参数即为服务端的IP+端口(由于我这只有一台计算机,故用户端和服务端用同一台计算机代替)。
②向服务端发起请求(第一次握手)
发起请求:发信息给服务端,既然是发消息,那要使用到IO流中的输出流,也就是写内容。
getOutputStream()方法也就是获取一个流,再用输出流的write()方法写内容。
③告诉服务器输出结束
这个是什么意思呢?
在IO流中读文件时是怎样判断读完了的?
返回值为-1时,就表示文件读完了,同时结束while循环。
但是这儿并不是文件,文件是死的,用户端是活的,服务器它并不确定用户端究竟说完没有。
所以shutdownOutput()方法,就是相当于服务端读到这儿时返回值为-1,结束循环。
这个其实很好了解,我们平常打电话的时候有时也会出现抢话现象,这也许在生活中是无关紧要的小事,但是在程序中在少量特殊场合都会重视这个问题。
所以电视上有时候会看到那些会议场所,发言人说完一段话后会说一句Over,表示自己说完了,后面的人接着开始说,这样就不会出现抢话现象了。
shutdownOutput(),也就相当于这个Over
④用户端接收服务端响应(第三次握手)
这个步骤是要在服务端接收用户端请求之后。
这个时候服务端已经接收到了信息,并也发信息过来,用户端接收其信息。
读信息自然就是IO流中输入流的read()方法:使用while循环,这段代码是IO流的基本代码。
⑤关流
socket关流,尽管IO流这有几个,但都是socket的关联资源,所以只要要关闭socket就好了。
三、服务端代码
创立一个服务端类:TcpServer
image
①服务端套接字
指定服务端的端口,IP也就是当前主机。
用户端要想访问这个服务端,那它填写的套接字要和服务端这儿的端口保持一致。
假如是两台电脑,我这台是服务端,另一台是用户端。
那我要把我的IP+端口告诉用户端,用户端在第一步中指定该IP+端口,即可以访问我这台电脑了。
②接受用户端的请求
服务端的accept()方法,返回值就是Socket对象。
所以发现没有?socket就是服务端和用户端之间沟通的一个桥梁。
无论是读数据还是写数据都是基于socket的。
小时候玩过传声筒的小伙伴应该知道:两个人拿着传声筒,拉很远,讲话也能听到。
这个socket就好比这个传声筒。
读用户端的请求,也就需要IO流中的输入流:
socket.getInputStream()得到的就是一个输入流,再使用read()方法读取用户端的消息。
③服务端响应用户端(第二次握手)
接到用户端的信息后,服务端要再次向用户端发送信息。
socket.getOutputStream()得到的就是一个输出流,再使用write()方法写发送给用户端的信息。
④关流
和用户端一样的道理。
其中ServerSocket也要关流。
四、运行代码
前面也说过了,先运行服务端代码,再运行用户端,结果如下:
image
①服务端控制台
服务端先运行代码,它运行后控制台上是没有输出的,它要等用户端向它发起请求。
其中服务端中accept方法是一个阻塞方法:
accept,接受的意思,就是接受用户端的请求。
假如用户端一直不向服务端发起请求,服务端就一直等,这样的话后面的代码都不会运行。
用户端一运行,向服务端发起请求,服务端上输出内容,就表明用户端的请求它接受到了。
②用户端控制台
假如说服务端是被动方,开启后等待请求;那用户端就是主动方,它一运行整个程序就跑起来了。
用户端上输出内容,也就表明服务端的响应它接受到了,即可以互相通信了。
总结
image
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 【Java】基础45:网络编程代码演练