tomcat/servlet学习笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ld705454682/article/details/78194410

1.网络进程间通信

怎么唯一标识网络上各主机的进程,从而实现网络进程通信?
tcp/ip协议族解决了这个问题,网络层的‘ip地址’可以唯一表示网络中的主机,而传输层的‘协议+端口’可以唯一表示主机中的应用程序(进程)。这样ip地址,协议,端口可以唯一标识网络进程。

2.TCP/IP协议和socket



应用层通过传输层进行数据通信时,往往会有多个传输层连接和应用进程同时进行通信,多个连接或应用进程通过同一个协议端口进行数据传输,为了区分不同的连接和应用进程,操作系统为应用层和传输层的交互提供了socket套接字接口。
socket是对tcp/ip协议的封装。是TCP/IP提供可供程序员做网络开发所用的接口,这就是Socket编程接口。

2.1http连接和socket连接

建立socket连接时可以指定传输层协议,如TCP,UDP。选择TCP协议时,socket连接就是一个tcp连接。
http连接是建立在tcp/ip连接基础之上,连接过程:
(1)建立连接:申请一个套接字(socket)并把它约束在一个端口上,如果成功就相当于建立了一个虚拟文件,可以通过此虚拟文件读写数据并通过网络传输。
(2)发送请求:打开一个连接后,客户机向服务器的停留端口发送请求消息。
(3)响应:服务器完成客户端的请求处理后,要向客户端发送响应消息。

(4)关闭socket连接:客户机和服务器均通过关闭套接字结束tcp/ip会话。

网络连接是比较底层的技术,各种web开发技术对细节进行了封装。

http连接和socket连接的区别:

HTTP协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用。

HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。

1)在HTTP 1.0中,客户端的每次请求都要求建立一次单独的连接,在处理完本次请求后,就自动释放连接。
 
2)在HTTP 1.1中则可以在一次连接中处理多个请求,并且多个请求可以重叠进行,不需要等待一个请求结束后再发送下一个请求。
 
由于HTTP在每次请求结束后都会主动释放连接,因此HTTP连接是一种“短连接,要保持客户端程序的在线状态,需要不断地向服务器发起连接请求。通常的做法是即时不需要获得任何数据,客户端也保持每隔一段固定的时间向服务器发送一次“保持连接”的请求。不仅可以保持在线,同时也是在“询问”服务器是否有新的数据,如果有就将数据传给客户端。

Socket连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开。但在实际网络应用中,客户端到服务器之间的通信往往需要穿越多个中间节点,例如 路由器、网关、防火墙等,大部分防火墙默认会关闭长时间处于非活跃状态的连接而导致 Socket 连接断连,因此需要通过轮询告诉网络,该连接处于活跃状态。
而HTTP连接使用的是“请求—响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。
很多情况下,需要服务器端主动向客户端推送数据,保持客户端与服务器数据的实时与同步。此时若双方建立的是Socket连接,服务器就可以直接将数据传送给客户端;若双方建立的是HTTP连接,则服务器需要等到客户端发送一次请求后才能将数据传回给客户端。

3.socket中tcp的建立

tcp的三次握手(建立连接)和四次挥手(断开连接)。

3.1三次握手

首先介绍下TCP报文,TCP报文包括首部(报头)和数据部分,报文头涉及到连接的几个字段如下:
(1)序号字段:SEQ序号,占32bit。TCP连接中传送的数据流中每一个字节都编上一个序号。序号字段的值则指的是本报文所发送的数据第一个字节的序号。
(2)确认序号:ACK序号,占32bit。对方期望收到报文数据第一个字节的序号。只有ACK标志位为1时,确认序号才有效。ACK=SEQ+1.
(3)标志位:共6个,即URG,ACK,PSH,RST,SYN,FIN等
                      确认位 ACK:为1时确认序号有效,为0时确认序号无效。
                      同步位SYN:置1时表示这是一个连接请求或连接接收报文。
                      终止位FIN:用来释放一个连接,为1时表明此发送端数据已发送完毕,要求释放连接。

连接过程:
第一次握手:client向server发送一个连接请求,在这个包中标志位SYN=1,发送序号SEQ=x(此例中x=200),client进入SYN_SEND状态,等待server确认。
第二次握手:server收到数据包,由SYN=1,知道是client请求建立连接,server将标志位SYN和ACK都置为1,确认序号ACK=x+1=201,随机产生一个发送序号SEQ=y(此例y=500),并将该数据包发送给client以确认连接请求,server进入SYN_RCVD状态。
第三次握手:client收到确认后,检查确认序号ACK是否为x+1=201,标志位ACK是否为1,如果正确,则将标志位ACK置为1,确认序号ACK=y+1=501,比那个将该数据包发送给server,server检查确认序号ACK是否为y+1=501,标志位ACK是否为1,如果正确则建立连接成功,client和server进入established状态。

1st client------>server      SYN=1 SEQ=200 
2nd server------->client    标志位SYN=1,ACK=1,ACK=201,SEQ=500
3rd client--------->server   标志位ACK=1 ,SEQ=201,ACK=501

3.2四次挥手

1st client------>server      标志位fin=1,ACK=1, 发送序号SEQ=200,确认序号ACK=y=500 。client进入FIN_WAIT_1状态。
2nd server------->client    标志位 ACK=1,ACK=201,SEQ=y=500
3rd server------->client    由于TCP连接是全双工的,每个方向都必须要单独进行关闭。当一方发送一个FIN,对方收到FIN后仅终止这一方向的连接,另一方也需要发送FIN。server也断开TCP连接。标志位ACK=1,FIN=1发送序号SEQ=y+1=501
4th client--------->server   标志位ACK=1,发送序号SEQ=201,确认序号ACK=502

套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。

服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。

客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。 

连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

4.java socket编程参考

socket API,需要注意的,编程实例
http://blog.csdn.net/hguisu/article/details/7445768/
http://blog.csdn.net/qq_23473123/article/details/51461894

5.tomcat/servlet

浏览器提交的请求是遵循http协议的文本。这段文本由服务器也就是tomcat接收并解析,封装成HttpServletRequest类型的request对象,所有的http头数据都可以通过request相应的方法查询到。
tomcat同时把HttpServletResponse类型的response对象。然后tomcat把request、response作为参数,调用servlet的相应方法。

5.tomcat项目部署

(1)
web程序部署在tomcat的/webapps下面,一个webapps文件夹可以部署多个不同的web应用,例如webapps/web1、webapps/web2,访问时网址分别为http://localhost:8080/web1,http://localhost:8080/web2,这两个不同的web应用分别称为两个context,路径/web1,/web2也称为上下文路径(ContextPath)。
如果不使用上下文路径,web程序需放到webapps/Root下面。Root文件夹下的程序使用http://localhost:8080/访问。
手动部署时,把工作空间中的项目文件夹(或项目的war包)放在webapps或ROOT下面,就可通过url访问。
(2)web程序文件结构:
/WEB-INF/,tomcat会隐藏该文件夹下的所有文件及文件夹,保护他们不能通过浏览器直接访问
/WEB-INF/web.xml web程序最主要的配置文件
/WEB-INF/classes class类文件都放在该文件下面,包括Sevlet类
/WEB-INF/lib/ jar文件都放在该文件下面













猜你喜欢

转载自blog.csdn.net/ld705454682/article/details/78194410