【叶凡网络】说说客户端和服务器端交互原理
- 2014-01-25 14:13:10 | 新闻来源:叶凡网络 | 点击量:763
不要被高深的名词和理论吓到其实HTTP客户端和服务器端的交互原理很简单:即先是浏览器和服务器端建立Socket无状态连接。然后通过IO流进行报文信息(这个报文是严格遵循HTTP报文接口的交互,最后会话结束后就关闭连接。对于这些底层的协议和报文的打包解包交互的实现,其实java和浏览器早都已经封装好了顺序员只要专注于业务逻辑的实现就行啦,这些都不必关心!
一种通信协议的7层抽象的参考模型,TCP/IP协议并不完全符合OSI七层参考模型。保守的开放式系统互连参考模型。其中每一层执行某一特定任务。该模型的目的使各种硬件在相同的层次上相互通信。这7层是:物理层、数据链路层、网路层、传输层、话路层、表示层和应用层。而TCP/IP通讯协议采用了4层的层级结构,每一层都呼叫它下一层所提供的网络来完成自己的需求。
如超文本传送协议(HTTP简单电子邮件传输(SMTP文件传输协议(FTP网络远程访问协议(Telnet等。i.应用层:应用顺序间沟通的层。提供了节点间的数据传送服务,ii.传输层:此层中。如传输控制协议(TCP用户数据报协议(UDP等,TCP和UDP给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收。让每一块数据包都能够到达目的主机(但不检查是否被正确接收)如网际协议(IPiii.互连网络层:负责提供基本的数据封包传送功能。定义如何使用实际网络(如EthernetSerialLine等)来传送数据。iv.网络接口层:对实际的网络媒体的管理。
HTTP属于应用层协议,位于TCP/IP协议的顶层i.HTTP一种超文本传送协议(HyperTextTransferProtocol,一套计算机在网络中通信的一种规则。TCP/IP体系结构中。意思是指 Web浏览器(客户端)和 Web服务器之间不需要建立耐久的连接。整个过程就是当一个客户端向服务器端发送一个请求(request然后Web服务器返回一个响应 respons,ii.HTTP一种无状态的协议。之后连接就关闭了服务端此时是没有保管连接的信息。iii.HTTP遵循 请求/响应(request/respons模型的所有的通信交互都被构造在一套请求和响应模型中。
浏览器通过HTTP协议与WEB服务器交换信息,Web服务器向Web浏览器返回的文件都有与之相关的类型,iv.浏览WEB时。这些信息类型的格式由MIME定义。还是HTTP协议也好,不管是TCP/IP协议也好。java都是通过套接字(java.net.Socket来实现的可以参考我另一篇技术博客:一个项目看javaTCP/IPSocket编程(1.3版)
数据实质上是通过IO流进行输出和输入,例如我浏览器里输入 http://cuishen.iteye.com客户端请求这个地址时即打开了web服务器HTTP端口的一个套接字。因为在网络中间作为传送数据的实体介质就是网线。这就不难理解我为什么在写一个Servlet时候要引用 importjava.io.*;原因 包括我向客户端回发结果的时候要用到PrintWrit对象的println方法。其实请求的这个地址还要加上端口号8080可以不写,因为浏览器默认的端口号是80
Java底层代码中是这样实现的只不过它已经帮我做了80; Socketsocket=newSocket"cuishen.iteye.com".InputStreamin=socket.getInputStream; OutputStreamout=socket.getOutputStream;
Web浏览器就会向Web服务器发送请求命令,一旦建立了TCP连接。一个ASCII文本请求行,后跟0个或多个HTTP头标,一个空行和实现请求的任意数据。HTTP规范定义了8种可能的请求方法:最常见的就是GET和 POST两种方法)GET--检索URI中标识资源的一个简单请求服务器只返回状态行和头标,HEA D--与GET方法相同。并不返回请求文档
每行一对。请求头标用来通知服务器有关客户端的功能和标识。请求头标:由keivalu健值组成。主地址,HOST--请求的哪一个服务器端地址。比方:技术blogcuishen.iteye.com,User-A g--用户即客户端可以使用的浏览器 如:Mozilla/4.0如image/giftext/htmlapplication/msworA ccept--即客户端可以接受的MIME类型列表。以字节给出POST数据的尺寸Content-Length--只适用于POST请求。
通知服务器以下不再有头标。发送回车符和退行。最常使用的Content-Typ和Content-Length头标。使用POST传送数据。
可以这样写出一个标准的HTTP请求:
POST/blog/242842HTTP1.1
HOST:cuishen.iteye.com/
User-A gent:Mozilla/4.0
text/html,A ccpt:image/gif.application/pdf,image/png...
key=value&key=value&key=value......POST请求的数据)
要去访问的服务器端的地址是cuishen.iteye.com/下面的资源 /blog/242842
连起来就是cuishen.iteye.com/blog/242842
浏览器版本是Mozilla/4.0这个页面用的HTTP1.1规范。
text/html,可以支持的MIME格式为 image/gif.application/pdf,image/png...等等
这个MIME格式我servlet中写法是response.setContentTyp"text/html;charset=gb2312";
或者在jsp中写法是<%@pagecontentType="text/html;charset=gb2312"%>
或者在html中写法是<metahttp-equiv="content-Type"content="text/html;charset=gb2312">
也就是请求行里面我这么样来做的GET和 POST最直观的区别就是GET方法将数据的请求跟在所请求的URL后面。
GET/blog/242842?key=value&key=value&key=value......HTTP1.1
实际上用 GET这样传送数据的
http://cuishen.iteye.com/?page=2......
iii.服务器端响应请求生成结果并回发(respons
定位指定的资源 http://cuishen.iteye.com/blog/242842
也有可能是一些验证等等,1根据请求时的GET/POST对应的用servlet里的doGet/doPost方法来处理(有可能是一些业务逻辑。也有可能是一些数据查询,提交等等)其有效的数据就来源于key=value&key=value&key=value......以及其它一些封装在request对象中的数据资源。
由 respons对象得到java.io.PrintWrit输出流对象out通过 out.println;将数据以指定的格式,2处置请求之后。如按照response.setcontentTyp"text/html;charset=gb2312";格式输出到输出流。
其区别就在于:请求阶段的请求行被状态行给替换了再来看响应报文:响应报文与请求报文非常类似。
3一个响应报文由四个部分组成:状态行、响应头标、空行、响应数据:
指出服务器的功能,b.响应头标:像请求头标一样。标识出响应数据的细节。
31Dec200523:59:59GMT--响应生成的日期和时间Date:Sat.
ContentType:'text/html;charset=gb2312'
只在浏览器使用永久(Keep-alHTTP连接时需要。Content-Length:122--响应中的字节数。
发送回车符和退行,c.空行:最后一个响应头标之后是一个空行。标明服务器以下不再有头标。
也就是HTML自身。out.println"<html>......";写到客户端。d.响应数据:HTML文档和图像等。
<html>
<head>
<title>Welcomtocuishen'ITblog</title>
</head>
<body>
看到这里 <!--这里是具体的内容。
相信大家对 HTTP工作原理及客户端与服务器交互过程已经很清楚了吧
-->
</body>
</html>
客户端解析回发响应报文,iv.服务器端关闭连接。恢复页面
检查请求是否成功的状态代码--HTTP响应码:404400200...1浏览器先解析状态行。.
如:解析每一个响应头标。
ContentType:text/html;charset=gb2312
只在浏览器使用永久(Keep-alHTTP连接时需要。Content-Length:122---响应中的字节数。
读取响应数据HTML根据标签<html></html>中的内容恢复规范的HTML格式页面或者其它
a.状态行:
状态行由三个标记组成:HTTP版本、响应代码和响应描述。
HTTP1.1---100---continu//继续追加后继内容
HTTP1.1---200---OK//一切正常
会自动连接HTTP1.1---301---MovePerman//请求的文档在其它地方。
不管授权没有HTTP1.1---403---Forbidden//绝对拒绝你访问这个资源。
HTTP1.1---400---BadRequest//客户端请求中的不良语法
绝对是大名鼎鼎的找不到HTTP1.1---404---NotFound//最常见。
HTTP响应码:告诉客户端应该对某些其它动作作出响应1xx提示性信息。xx这些就代表了请求胜利,为了完成请求,xx重定向。必需进一步执行的动作,xx客户端错误,500-599:服务器端的错误
浏览器会识别,一个HTML文档可能包括其它需要被载入的资源。并对这些资源再进行额外的请求,这个过程可以是循环的方式一直到所有的数据都依照响应头标中规定的格式恢复到页面中。服务器端关闭连接,数据传送完毕。即无状态协议。
上一篇:【叶凡网络】乌克兰总统反对派不买账要总统辞职承诺改组政府
下一篇:【叶凡网络】习近平出席索契冬奥会,体现出中俄关系