初学者应注意,我们搭建网站是为了进行网络通信的,那么java网络通信需要遵循什么协议呢。
在此之前我们需要先了解一个名词——OSI模型,它是一种概念模型,国际标准化组织提出,一个试图使各种计算机在世界范围内互连为网络的标准框架。
OSI七层网络模型(从下往上):
TCP/IP四层模型:
以上两种模型,TCP/IP是在Internet网络不断发展的过程中建立的,基于时间,有很高的信任度。而OSI则是一种理论上的模型。
也就是说我们在网络通信中,是经历了这么多层才完成的。IP协议层只是完成了网络联通的工作,TCP、UDP协议只是完成了数据的传输工作,HTTP、HTTPS等协议只是完成了应用程序间沟通交互的工作。
TCP/IP概念:TCP/IP是一个协议簇,里面包括很多协议的。UDP只是其中的一个。之所以命名为TCP/IP协议, 因为TCP,IP协议是两个很重要的协议,就用它两命名了。
在网络层(也就是IP协议层)还有一个需要我们注意的点——DNS,有些初学者在学有小成后会想要搭建一个自己的网站,但是我们会发现,在租购服务器后,我们仅仅能够看到服务器在网络中的ip地址,我们需要购买相应的域名,将域名与ip地址绑定,也就是将域名和IP地址相互映射,这就是DNS的工作范畴。
让我们看一下我们访问网址时,电脑都做了什么:
所以,通常我们在访问网站时,先去的是域名服务器,用我们输入的网址兑换出来相应的数字ip地址,然后才是去访问这个ip地址的。
网络地址是找到了,但是应用程序呢,电脑上有很多应用程序的,我们仅仅通过ip并不能知道我们要访问的是电脑上的哪一个程序。端口出现了:
套接字(Socket)是TCP/IP网络通信的基本操作单元。不同主机间的双向通信端点,某程序将一段数据写入套接字中,该套接字就会将该数据发送给另一个与之通信的另外一个套接字,就像电话线一样。当然,这一过程所经历的,就是本篇文章一开始讲的那个TCP/IP四层模型。
socket套接字连接的建立过程:服务器监听、客户端请求、连接确认。
它是属于数据传输层的。通过Socket套接字建立连接,再通过socket发送/接收数据。
特点:数据传输因建立了连接而显得更为安全可靠,缺点也同样因为连接的建立而产生了过大的开销。
三次握手建立连接:
四次挥手终止连接(终止需要两个端分别主动挥手一次)
UDP协议也属于数据传输层,它是不可靠的网络协议,之所以不可靠,是因为他的通信不会建立连接,这可能会导致丢失数据包。但是! 正因为不建立连接,它的开销会很小,通常用在视频、语音、游戏等场景,这些场景丢包也不会影响全局。
HTTP协议属于应用层。它被设计用于Web浏览器和Web服务器之间的通信,但它也可以用于其他目的。
由这个流程图我们可以看出,HTTP协议是给web浏览器和服务器端看的,浏览器采用这个协议去解析数据,然后再采用TCP协议来建立连接传输数据等。
类似于:应用层(浏览器端)>主机到网络层(物理层)>网络连接层(IP)>数据传输层>应用层(服务器端)
初学者注意,重点来了!!!
Servlet是Java应用程序,它由Web服务器进行加载。
上面我们已经说到了,网站应用层大部分使用的是HTTP、HTTPS协议,而这些协议是作用在web浏览器和web服务器上的(web服务器与HTTP协议相匹配),servlet又是由web服务器加载的。所以通信采用HTTP协议能够与web服务器交流,web服务器再与内部加载的servlet交流,进而就进入了我们的java程序。当然servlet的运行需要java虚拟机的支持。
servlet与socket:socket的作用是数据传输io,而servlet在此基础上增加了协议支持。servlet可以看做是web容器运行的一部分逻辑(请求和响应,执行完servlet.service方法后,由容器传递给socket类的outputstream,完成相关操作)。也就是说我们在应用层使用的是servlet,之后web容器还是会在基础层级去使用socket套接字的。
Servlet声明周期:首先加载servlet的class,实例化servlet,然后初始化servlet调用init()的方法,接着调用服务的service的方法处理doGet和doPost方法,最后容器关闭时候调用destroy 销毁方法。
- init(); //仅执行一次,在服务器载入servlet时执行或第一次访问时执行,servlet是由容器(如tomcat)创建的
- service(); //Servlet每次处理请求时都会调用service()方法,内部会调用相应的doGet(); doPost();等,所以在我们覆写时通常覆写的都是这两个方法
- destroy(); //仅执行一次,在服务器卸装servlet时执行
服务器每次收到对servlet的请求都会产生一个新的线程,调用service()方法。