浅析Java web程序之客户端和服务器端交互原理

浅析Java web程序之客端和服器端交互原理

近来一直在思考一个疑什么在用struts框架开FormBean要序列化,即实现Java.io.Serializable接口,本着勤学好的精神我Google了下象序列化方面的文章,然大体明白了如何做,但是是没有搞清楚什么要这样做;尾我想理一个疑要找疑的根源和本,于是从web程序客端和端交互的原理入手,于找到了我要的答案。
  1. 象序列化是什么东东

  基本地Java象列化就是要把内存中的Java象保存下来(持久化),以便可以在网传输或今后继续运用象中的数据。序列化的流程就是象写入字流和从字流中象。象状态转换成字流之后,可以用java.io包中的各种字将其保存到文件中,管道到另一线程中或通络连接将象数据送到另一主机。序列化分两大部分:序列化和反序列化。序列化是个流程的第一部分,将数据分解成字流,以便在文件中或在网传输。反序列化就是打开字流并重构象。

  2. 协议

  a. TCP/IP整体构架概述

  TCP/IP协议并不完全契合 OSI的七参考模型。传统的开放式系参考模型,是一种通信协议7抽象的参考模型,其中每一层执行某一特定任模型的目的是使各种硬件在相同的次上相互通信。7:物理、数据、网路传输层、示意和运用 。而TCP/IP讯协议采用了4层级结构,每一都呼叫它的下一所提供的网来完成自己的需求。4别为

i. 运用 :运用 程序沟通的,如超文本协议HTTP)、基本传输SMTP)、文件传输协议FTP)、网络远访问协议Telnet)等。
  ii. 传输层:在此中,它提供了的数据送服,如传输控制协议TCP)、用数据报协议UDP)等,TCPUDP数据包参加传输数据并把它传输到下一中,层负责传送数据,并且确定数据已被送达并接收。

  iii. 络层负责提供基本的数据封包送功能,每一数据包都能到达目的主机(但不检验能无法 被正确接收),如网际协议IP)。

  iv. 网接口对实际的网媒体的维护,定如何 运用实际(如EthernetSerial Line等)来送数据。

  b. HTTP协议推荐:

  i. HTTP是一种超文本协议HyperText Transfer Protocol,是一套算机在网中通信的一种准。在TCP/IP体系构中,HTTP属于运用 层协议,位于TCP/IP协议顶层

  ii. HTTP是一种无状的的协议,意思是指 在Web 阅读器(客端)和 Web 器之要建立持久的接。整个流程就是当一个客端向服器端送一个(request),然后Web器返回一个响 (response),之后接就关上了,在服端此是没有保存接的信息。

  iii. HTTP 遵循 /(request/response) 模型的,所有的通信交互都被构造在一套求和响模型中。

iv.  阅读 WEB阅读器通HTTP协议WEB器交信息,Web器向Web阅读器返回的文件都有与之相关 的,些信息型的格式由MIME
  c. 协议java实现方式

  不TCP/IP协议也好,HTTP协议也好,java都是通套接字(java.net.Socket)来实现的,可以参考我的另一篇技能博客:一个目看java TCP/IP Socket(1.3
)
  3. HTTP文接口及客端和服器端交互原理

  a. HTTP的事务处理由以下四步成:

  i.  建立接:

  例如我在阅读器里 http://cuishen.javaeye.com,客个地址即打开了webHTTP端口的一个套接字。因在网为传递数据的体介就是网线,数据实质上是通IO出和入,就不理会咱们为什么在写一个Servlet候要引用 import java.io.*; 的原由,包括咱在向客端回发结果的候要用到PrintWriter象的println()。其实请求的个地址要加上端口号8080可以不写,是因为阅读器默的端口号是80

  在Java中是这样实现的,只不帮咱做了。

  Java

    Socket socket = new Socket("cuishen.javaeye.com",80); 

    InputStream in = socket.getInputStream(); 
    OutputStream out = socket.getOutputStream(); 

ii. HTTP文(request
  一旦建立了TCP接,Web阅读器就会向Web求命令,是一个ASCII文本求行,后跟0个或多个HTTP头标,一个空行和实现请求的任意数据。

  即文分四个部分:求行,头标,空行和求数据

  1求行

  求行由三个标记组成:求要URLHTTP版本,中用空格分开

  例如:
GET cuishen.javaeye.com/blog/242842 HTTP/1.1
  HTTP范定8种可能的求要(最多的就是 GET POST 两种要
)
  GET -- URI标识资源的一个基本

  HEAD -- GET相同,服器只返回状行和头标,并不返回求文档

  POST -- 器接受被写入客出流中的数据的

  PUT -- 器保存求数据作指定URI新内容的

  DELETE -- URI中命名的源的

  OPTIONS -- 关于服器支撑的求要信息的

  TRACE -- Web器反Http求和其头标

  CONNECT -- 已文档化但当前未实现的一个要留做隧道

  2头标

  头标:由key value 值组成,每行一头标用来通知服器相关客端的功能和标识

  HOST -- 求的哪一个服器端地址,主地址,比如:我的技能 blogcuishen.javaeye.com

User-Agent -- 用户即客户端可以运用的阅读器,如: Mozilla/4.0

Accept -- 即客端可以接受的MIME 型列表,如image/giftext/Htmlapplication/msWord

Content-Length -- 只适用于POST求,以字节给POST数据的尺寸
  3)空行 

  
送回符和退行,通知服器以下不再有头标
  4
求数据
  运用 POST
送数据,最常运用的是Content-TypeContent-Length头标
  
总结
  咱
可以这样写出一个规则 HTTP求:
  POST 
/blog/242842 HTTP1.1
  
HOST: cuishen.javaeye.com/
  
User-Agent: Mozilla/4.0
  
Accpt: image/gif,text/html,application/pdf,image/png...
  key=value&key=value&key=value...... (POST()
求的数据)
  
上面的一个例子意思是:
  我要去
访问的服器端的地址是cuishen.javaeye.com/ 它下面的 /blog/242842,
起来就是: cuishen.javaeye.com/blog/242842
  
面用的是 HTTP1.1 范,我的阅读器版本是Mozilla/4.0 
  可以支撑的MIME格式
  image/gif,text/html,application/pdf,image/png...等等,  MIME格式咱servlet中写法是:response.setContentType("text/html;charset=gb2312");
  或者在jsp中写法是:<%@ page contentType="text/html;charset=gb2312"%>

或者在html中写法是:<meta http-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.javaeye.com/?page=2......
  iii.
器端响应请求生成果并回response
  Web
器分析求,定位指定的 http://cuishen.javaeye.com/blog/242842
  1)根据
GET/POST 对应的用servlet里的 doGet() / doPost()理(有可能是一些业务逻辑,也有可能是一些验证等等,也有可能是一些数据查询,提交等等)其有效的数据就来源于 key=value&key=value&key=value......,以及其它的一些封装在 request 象中的数据源。
  2
求之后,由 response 象得到 java.io.PrintWriter 出流out,通 out.println(); 将数据以指定的格式,如按照response.setcontentType("text/html;charset=gb2312");的格式出到出流。
  
它的响应报文与文特别类似,其区就在于:咱段的求行被状了,再来看响应报文:
  3)一个响应报文由四个部分成:状行、响应头标、空行、响数据:

  (a).行:

  状行由三个标记组成:HTTP版本、响和响描述。

  HTTP1.1 --- 100 --- continue  //继续追加后
内容
  HTTP1.1 --- 200 --- OK  //一切正常

  HTTP1.1 --- 301 --- Moved Permanently  //
求的文档在其它地点,会自动连
  HTTP1.1 --- 403 --- Forbidden  //
绝对访问这源,不管授没有

HTTP1.1 --- 400 --- Bad Request  //求中的不良
  HTTP1.1 --- 404 --- Not Found  //最多绝对是大名鼎鼎的找不到

  HTTP应码

  1xx:提示性信息,告应该对某些其它的作作出响

  2xx些就代表了成功

  3xx:重定向,了完成求,必须进一步行的

  4xx:客错误

  500-599: 器端的错误

  (b).应头标:像头标,它指出服器的功能,标识出响数据的细节

  Date: Sat, 31 Dec 2005 23:59:59 GMT  --生成的日期和时间

  
ContentType: 'text/html;charset=gb2312'
  Content-Length: 122  --中的字数,只在阅读器运用久(Keep-aliveHTTP时须要。

  (c).空行:尾一个响应头标之后是一个空行,送回符和退行,表明服器以下不再有头标

  (d).数据:HTML文档和像等,也就是HTML本身。out.println("<html>......");写到客端。

  Html   

     <html>
 
      <head>
 
       <title>Welcome
 to cuishen's IT blog</title> 
      </head>
 
      <body>
 
      <!--
 里是详细的内容,看到了里 相信大众 HTTP 工作原理及客端与服  

器交互流程已很清楚了吧 
-->
 

</body> 
</html>
 

iv. 器端关上接,客端分析回应报文,
  1阅读器先分析状行,求能无法 成功的状--HTTP应码
404 400 200 ....
  2) 分析 每一个响应头标,如:

  ContentType: text/html;charset=gb2312                                                                                                                                                 

  Content-Length: 122 --- 中的字数,只在阅读器运用久(Keep-aliveHTTP时须要。

  3取响数据HTML,根据标签<html></html>中的内容规则HTML格式面或者其它。

  4)一个HTML 文档可能包含其它的要被入的源,阅读器会识别,并对这源再外的求,个流程可以是循的方式一直到所有的数据都按照响应头标定的格式原到面中。

  5)数据送完,服器端关上接,即无状态协议

  4. 总结

  不要被高深的名和理吓到,其HTTP端和服器端的交互原理很基本:即先是阅读器和服器端建立Socket无状态连接,也就是短接,然后通IO文信息(文是格遵循HTTP文接口的)的交互,尾会话结束后就关上接。些底协议文的打包解包交互的实现,其java阅读器早都已封装好了,程序只要注于业务逻辑实现就行啦,些都不必关心!!

  搞明白了交互原理,咱再回过头看看最初那个疑,其实这个疑回答:jsp尾 是被java web编译servlet行的,struts框架的本也是servlet + javaBean做了封装,所以尾 服阅读器的响数据是通过调 out.println("<html>......");IO流写到客端的。本formBean是被翻成字流然后写到客端的,只要是把象的属性保存成字流(String也是)就是序列化,把象持久化就是序列化的流程。就是什么ActionForm制序列化的原由。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值