魔幻大陆怎么没人玩了:JavaWeb 技术详解
来源:百度文库 编辑:九乡新闻网 时间:2024/07/07 11:15:45
第一章:Web 运作原理
1. Web的概念:Web是一种分布式应用架构,旨在共享分布在网络上的各个Web服务器中的所有互相连接的信息。Web采用客户/服务器通行模式,客户与服务器之间用HTTP协议通信。Web使用超级文本技术(HTML)来连接网络上的信息。信息存放在服务器端,客户机通过浏览器就可以查找网络中的各个Web服务器上的信息.
与Web相关的一个概念是WWW(World Wide Web) 。WWW是指全球范围内的Web,它以Internet为网络平台,Internet是来自世界各地的相互连接的计算机和其他设备的集合,而WWW则是Internet上的一种分布式应用架构.
Web 具有以下三个特征:
a) 用超级文本技术HTML来表达信息,以及建立信息与信息的连接。
b) 用同一的资源定位技术url来实现网络上的信息的精确定位。
c) 用网络应用层协议HTTP来规范浏览器与Web服务器之间的通信过程。
2. HTML简介
HTML(Hyper Text Markup Language) 是指超级文本标记语言。
HTML具有以下特征:
a) 允许直接包括纯文本形式的信息。
b) 利用和等标记来包括图片和声音等多媒体形式的信息。
c) 利用 常见的Html字符和实际字符的对应关系如下连接: http://114.xixik.com/character/ 3. URL简介: 统一资源定位符(URL)是用于完整地描述Internet上网页和其他资源的地址的一种标识方法。 Internet上的每一个网页都具有一个唯一的名称标识,通常称之为URL地址,这种地址可以是本地磁盘,也可以是局域网上的某一台计算机,更多的是Internet上的站点。简单地说,URL就是Web地址,俗称“网址”。 URI 方案集,包含如何访问 Internet 上的资源的明确指令。 URL 是统一的,因为它们采用相同的基本语法,无论寻址哪种特定类型的资源(网页、新闻组)或描述通过哪种机制获取该资源。 对于 Internet 服务器或万维网服务器上的目标文件,可以使用“统一资源定位符 (URL)”地址(该地址以“http://”开始)。Web 服务器使用“超文本传输协议 (HTTP)”,一种“幕后的”Internet 信息传输协议。例如,http://www.microsoft.com/ 为 Microsoft 网站的万维网 URL 地址。 URL的一般格式为(带方括号[]的为可选项): protocol :// hostname[:port] / path / [;parameters][?query]#fragment URL由三部分组成:协议类型,主机名和路径及文件名。通过URL可以指定的主要有以下几种:http、ftp、gopher、telnet、file等。 1、protocol(协议):指定使用的传输协议,下表列出 protocol 属性的有效方案名称。 最常用的是HTTP协议,它也是目前WWW中应用最广的协议。 file 资源是本地计算机上的文件。格式file:// ftp 通过 FTP访问资源。格式 FTP:// gopher 通过 Gopher 协议访问该资源。 http 通过 HTTP 访问该资源。 格式 HTTP:// https 通过安全的 HTTPS 访问该资源。 格式 HTTPS:// mailto 资源为电子邮件地址,通过 SMTP 访问。 格式 mailto: MMS 通过 支持MMS(流媒体)协议的播放该资源。(代表软件:Windows Media Player)格式 MMS:// ed2k 通过 支持ed2k(专用下载链接)协议的P2P软件访问该资源。(代表软件:电驴) 格式 ed2k:// Flashget 通过 支持Flashget:(专用下载链接)协议的P2P软件访问该资源。(代表软件:快车) 格式 Flashget:// thunder 通过 支持thunder(专用下载链接)协议的P2P软件访问该资源。(代表软件:迅雷) 格式 thunder:// news 通过 NNTP 访问该资源。 tencent 通过支持tencent(专用聊天连接) 协议和用户对话。(代表软件:QQ、TM)格式 tencent://message/?uin=号码&Site=&Menu=yes msnim 通过支持msnim(专用聊天连接) 协议和用户对话。(代表软件:MSN、WLM) 格式 msnim:chat?contact=邮箱地址 2、hostname(主机名):是指存放资源的服务器的域名系统 (DNS) 主机名或 IP 地址。有时,在主机名前也可以包含连接到服务器所需的用户名和密码(格式:username:password)。 3、port(端口号):整数,可选,省略时使用方案的默认端口,各种传输协议都有默认的端口号,如http的默认端口为80。如果输入时省略,则使用默认端口号。有时候出于安全或其他考虑,可以在服务器上对端口进行重定义,即采用非标准端口号,此时,URL中就不能省略端口号这一项。 4、path(路径):由零或多个“/”符号隔开的字符串,一般用来表示主机上的一个目录或文件地址。 5、;parameters(参数):这是用于指定特殊参数的可选项。 6、?query(查询):可选,用于给动态网页(如使用CGI、ISAPI、PHP/JSP/ASP/ASP.NET等技术制作的网页)传递参数,可有多个参数,用“&”符号隔开,每个参数的名和值用“=”符号隔开。 7、fragment,信息片断,字符串,用于指定网络资源中的片断。例如一个网页中有多个名词解释,可使用fragment直接定位到某一名词解释。 注意,Windows 主机不区分 URL 大小写,但是,Unix/Linux 主机区分大小写。 下面列表是常见的URL中定位和标识的服务或文件: http:文件在WEB服务器上. file:文件在您自己的局部系统或匿名服务器上 ftp:文件在FTP服务器上 gopher:文件在gopher服务器上 wais:文件在wais服务器上 news:文件在Usenet服务器上 telnet:连接到一个支持Telnet远程登录的服务器上 URL转发 所谓URL转发,是通过服务器的特殊设置,将访问您当前域名的用户引导到您指定的另一个网络地址。例如,URL转发可以让用户在访问http://www.abc.com时,自动转向访问到一个您自己指定的网址“http://www.123.com”,URL转发功能是万网提供的域名注册后的增值服务。 URL发展背景 URL也被称为网页地址,是因特网上标准的资源的地址(Address)。它最初是由蒂姆·伯纳斯-李发明用来作为万维网的地址的。现在它已经被万维网联盟编制为因特网标准RFC1738了。在因特网的历史上,统一资源定位符的发明是一个非常基础的步骤。统一资源定位符的语法是一般的,可扩展的,它使用ASCII代码的一部分来表示因特网的地址。统一资源定位符的开始,一般会标志着一个计算机网络所使用的网络协议。 相关资料 URI方案集 包含如何访问Internet上的资源的明确指令。 URL是统一的,因为它们采用相同的基本语法,无论寻址哪种特定类型的资源(网页、新闻组)或描述通过哪种机制获取该资源。对于Internet服务器或万维网服务器上的目标文件,可以使用“统一资源定位符(URL)”地址(该地址以“http://”开始)。Web服务器使用“超文本传输协议(HTTP)”,一种“幕后的”Internet信息传输协议。例如,http://www.microsoft.com/为Microsoft网站的万维网URL地址。 统一资源定位符与统一资源标志符 统一资源定位符是统一资源标志符的一个变种。统一资源标志符确定一个资源,而统一资源定位符不但确定一个资源,而且还表示出它在哪里。比如下面的统一资源标志符确定因特网工程工作组RFC1738,但并没有说出在哪里才找得到这份资料:urn:ietf:rfc:1738。而下面这些统一资源定位符则确定每个RFC1738文献,而且还确定这些文献在哪里找得到: * http://www.ietf.org/rfc/rfc1738.txt * http://www.w3.org/Addressing/rfc1738.txt * http://rfc.sunsite.dk/rfc/rfc1738.html 历史上几乎所有的统一资源标志符都是统一资源定位符,因此这篇文章中所介绍的许多内容对两者来说都是一样的。 统一资源定位符体制:每个统一资源定位符的开始都是该统一资源定位符的体制,其后是按体制不同的部分。 统一资源定位符的日常使用 超文本传输协议统一资源定位符将从因特网获取信息的四个基本元素包括在一个简单的地址中: 1. 传送协议; 2. 服务器; 3. 端口号; 4. 路径。 典型的统一资源定位符看上去是这样的: http://zh.wikipedia.org:80/wiki/Special:Search?search=铁路&go=Go 其中: 1. http,是协议; 2. zh.wikipedia.org,是服务器; 3. 80,是服务器上的网络端口号; 4. /wiki/Special:Search,是路径; 5. ?search=铁路&go=Go,是询问。 大多数网页浏览器不要求用户输入网页中「http://」的部分,因为绝大多数网页内容是超文本传输协议文件。同样,「80」是超文本传输协议文件的常用端口号,因此一般也不必写明。一般来说用户只要键入统一资源定位符的一部分(zh.wikipedia.org/wiki/铁路)就可以了。由于超文本传输协议允许服务器将浏览器重定向到另一个网页地址,因此许多服务器允许用户省略网页地址中的部分,比如 www。从技术上来说这样省略后的网页地址实际上是一个不同的网页地址,浏览器本身无法决定这个新地址是否通,服务器必须完成重定向的任务。 关于URL结构一般分为两个部分,一个是物理结构,一个是逻辑结构。在物理结构包括扁平结构和树型结构。扁平结构就是网站中所有的页面都是在根目录这一级别,形成一个扁平的物理结构。这比较适合于小型的网站,因为如果太多文件都放在根目录下的话,制作和维护起来比较麻烦。而树型结构的意义是在一级目录下分为多个频道或者称支为目录,然后目录下面再放上属于这个频道的页面,首页、频道首页、频道下的内容就好比树干、树枝、树叶的关系。逻辑结构就是由网页内部链接所形成的逻辑的或链接的网络图。比较好的情况是逻辑结构与前面的树型物理结构相吻合。 如左图所示 主页链接向所有的频道主页;主页一般不直接链接向内容页,除非是你非常想推的几个特殊的页;所有频道主页都连向其他频道主页;频道主页都连回网站主页;频道主页也连向属于自己本身频道的内容页;频道主页一般不连向属于其他频道的内容页;所有内容页都连向网站主页;所有内容页都连向自己的上一级频道主页;内容页可以连向同一个频道的其他内容页;内容页一般不连向其他频道的内容页;内容页在某些情况下,可以用适当的关键词连向其他频道的内容页。 首先,需要注意URL的长度,在URL里最好不要超过3-5个关键词,如果超过5个关键词,该url的权重就会被相应的降低。 其次,在URL中尽量不要出现重复。 最后,切忌在命名的时候用.exe之类的后缀作为URL的结尾。 统一资源定位器(URL)是为了能够使客户端程序查询不同的信息资源时有统一访问方法而定义的一种地址标识方法。在Internet上所有资源都有一个独一无二的URL地址。 最大缺点:当信息资源的存放地点发生变化时,必须对URL作相应的改变。因此人们正在研究新的信息资源表示方法,例如:URI (Universal Resource Identifier)即“通用资源标识”(参见RFC 1630)、URN (Uniform Resource Name)即“统一资源名”和URC(Uniform Resource Citation)即“统一资源引用符”等。 统一资源定位符(URL,英语Uniform Resource Locator的缩写)也被称为网页地址,是因特网上标准的资源的地址。它最初是由蒂姆·伯纳斯-李发明用来作为万维网的地址的。现在它已经被万维网联盟编制为因特网标准RFC1738了。 在因特网的历 统一资源定位符(URL)是用于完整地描述Internet上网页和其他资源的地址的一种标识方法。 Internet上的每一个网页都具有一个唯一的名称标识,通常称之为URL地址,这种地址可以是本地磁盘,也可以是局域网上的某一台计算机,更多的是Internet上的站点。简单地说,URL就是Web地址,俗称“网址”。 URI 方案集,包含如何访问 Internet 上的资源的明确指令。 URL 是统一的,因为它们采用相同的基本语法,无论寻址哪种特定类型的资源(网页、新闻组)或描述通过哪种机制获取该资源。 对于 Internet 服务器或万维网服务器上的目标文件,可以使用“统一资源定位符 (URL)”地址(该地址以“http://”开始)。Web 服务器使用“超文本传输协议 (HTTP)”,一种“幕后的”Internet 信息传输协议。例如,http://www.microsoft.com/ 为 Microsoft 网站的万维网 URL 地址。 URL的一般格式为(带方括号[]的为可选项): protocol :// hostname[:port] / path / [;parameters][?query]#fragment 下面列表是常见的URL中定位和标识的服务或文件: http:文件在WEB服务器上. file:文件在您自己的局部系统或匿名服务器上 ftp:文件在FTP服务器上 gopher:文件在gopher服务器上 wais:文件在wais服务器上 news:文件在Usenet服务器上 telnet:连接到一个支持Telnet远程登录的服务器上 URL转发 所谓URL转发,是通过服务器的特殊设置,将访问您当前域名的用户引导到您指定的另一个网络地址。例如,URL转发可以让用户在访问http://www.abc.com时,自动转向访问到一个您自己指定的网址“http://www.123.com”,URL转发功能是万网提供的域名注册后的增值服务。 URL发展背景 URL也被称为网页地址,是因特网上标准的资源的地址(Address)。它最初是由蒂姆·伯纳斯-李发明用来作为万维网的地址的。现在它已经被万维网联盟编制为因特网标准RFC1738了。在因特网的历史上,统一资源定位符的发明是一个非常基础的步骤。统一资源定位符的语法是一般的,可扩展的,它使用ASCII代码的一部分来表示因特网的地址。统一资源定位符的开始,一般会标志着一个计算机网络所使用的网络协议。 相关资料 URI方案集 包含如何访问Internet上的资源的明确指令。 URL是统一的,因为它们采用相同的基本语法,无论寻址哪种特定类型的资源(网页、新闻组)或描述通过哪种机制获取该资源。对于Internet服务器或万维网服务器上的目标文件,可以使用“统一资源定位符(URL)”地址(该地址以“http://”开始)。Web服务器使用“超文本传输协议(HTTP)”,一种“幕后的”Internet信息传输协议。例如,http://www.microsoft.com/为Microsoft网站的万维网URL地址。 统一资源定位符与统一资源标志符 统一资源定位符是统一资源标志符的一个变种。统一资源标志符确定一个资源,而统一资源定位符不但确定一个资源,而且还表示出它在哪里。比如下面的统一资源标志符确定因特网工程工作组RFC1738,但并没有说出在哪里才找得到这份资料:urn:ietf:rfc:1738。而下面这些统一资源定位符则确定每个RFC1738文献,而且还确定这些文献在哪里找得到: * http://www.ietf.org/rfc/rfc1738.txt * http://www.w3.org/Addressing/rfc1738.txt * http://rfc.sunsite.dk/rfc/rfc1738.html 历史上几乎所有的统一资源标志符都是统一资源定位符,因此这篇文章中所介绍的许多内容对两者来说都是一样的。 统一资源定位符体制:每个统一资源定位符的开始都是该统一资源定位符的体制,其后是按体制不同的部分。 统一资源定位符的日常使用 超文本传输协议统一资源定位符将从因特网获取信息的四个基本元素包括在一个简单的地址中: 1. 传送协议; 2. 服务器; 3. 端口号; 4. 路径。 典型的统一资源定位符看上去是这样的: http://zh.wikipedia.org:80/wiki/Special:Search?search=铁路&go=Go 其中: 1. http,是协议; 2. zh.wikipedia.org,是服务器; 3. 80,是服务器上的网络端口号; 4. /wiki/Special:Search,是路径; 5. ?search=铁路&go=Go,是询问。 大多数网页浏览器不要求用户输入网页中「http://」的部分,因为绝大多数网页内容是超文本传输协议文件。同样,「80」是超文本传输协议文件的常用端口号,因此一般也不必写明。一般来说用户只要键入统一资源定位符的一部分(zh.wikipedia.org/wiki/铁路)就可以了。由于超文本传输协议允许服务器将浏览器重定向到另一个网页地址,因此许多服务器允许用户省略网页地址中的部分,比如 www。从技术上来说这样省略后的网页地址实际上是一个不同的网页地址,浏览器本身无法决定这个新地址是否通,服务器必须完成重定向的任务。 关于URL结构一般分为两个部分,一个是物理结构,一个是逻辑结构。在物理结构包括扁平结构和树型结构。扁平结构就是网站中所有的页面都是在根目录这一级别,形成一个扁平的物理结构。这比较适合于小型的网站,因为如果太多文件都放在根目录下的话,制作和维护起来比较麻烦。而树型结构的意义是在一级目录下分为多个频道或者称支为目录,然后目录下面再放上属于这个频道的页面,首页、频道首页、频道下的内容就好比树干、树枝、树叶的关系。逻辑结构就是由网页内部链接所形成的逻辑的或链接的网络图。比较好的情况是逻辑结构与前面的树型物理结构相吻合。 如左图所示 主页链接向所有的频道主页;主页一般不直接链接向内容页,除非是你非常想推的几个特殊的页;所有频道主页都连向其他频道主页;频道主页都连回网站主页;频道主页也连向属于自己本身频道的内容页;频道主页一般不连向属于其他频道的内容页;所有内容页都连向网站主页;所有内容页都连向自己的上一级频道主页;内容页可以连向同一个频道的其他内容页;内容页一般不连向其他频道的内容页;内容页在某些情况下,可以用适当的关键词连向其他频道的内容页。 首先,需要注意URL的长度,在URL里最好不要超过3-5个关键词,如果超过5个关键词,该url的权重就会被相应的降低。 其次,在URL中尽量不要出现重复。 最后,切忌在命名的时候用.exe之类的后缀作为URL的结尾。 统一资源定位器(URL)是为了能够使客户端程序查询不同的信息资源时有统一访问方法而定义的一种地址标识方法。在Internet上所有资源都有一个独一无二的URL地址。 最大缺点:当信息资源的存放地点发生变化时,必须对URL作相应的改变。因此人们正在研究新的信息资源表示方法,例如:URI (Universal Resource Identifier)即“通用资源标识”(参见RFC 1630)、URN (Uniform Resource Name)即“统一资源名”和URC(Uniform Resource Citation)即“统一资源引用符”等。 统一资源定位符(URL,英语Uniform Resource Locator的缩写)也被称为网页地址,是因特网上标准的资源的地址。它最初是由蒂姆·伯纳斯-李发明用来作为万维网的地址的。现在它已经被万维网联盟编制为因特网标准RFC1738了。 在因特网的历史上,统一资源定位符的发明是一个非常基础的步骤。统一资源定位符的语法是一般的,可扩展的,它使用ASCII代码的一部分来表示因特网的地址。一般统一资源定位符的开始标志着一个计算机网络所使用的网络协议。 URL就是统一资源定位器(UniformResourceLocator:URL)。通俗地说,它是用来指出某一项信息的所在位置及存取方式;更严格一点来说,URL就是在WWW上指明通讯协议以及定位来享用网络上各式各样的服务功能。 在WWW上各种功能的服务器主机千万有余,必须靠URL这个单一又简单的方式,才能找到用户所要的文件在哪个服务器主机及这个主机上的哪个目录。因此我们也可以说URL就是WWW文件的参考(Reference)格式,使用者只要在浏览器输入地址处输入URL的格式内容,便可以得到其所指定的主机相关文件。简单地说,URL就是WWW服务器主机的地址,也叫做网址。 URL就是统一资源定位器(UniformResourceLocator:URL)。通俗地说,它是用来指出某一项信息的所在位置及存取方式;更严格一点来说,URL就是在WWW上指明通讯协议以及定位来享用网络上各式各样的服务功能。 在WWW上各种功能的服务器主机千万有余,必须靠URL这个单一又简单的方式,才能找到用户所要的文件在哪个服务器主机及这个主机上的哪个目录。因此我们也可以说URL就是WWW文件的参考(Reference)格式,使用者只要在浏览器输入地址处输入URL的格式内容,便可以得到其所指定的主机相关文件。简单地说,URL就是WWW服务器主机的地址,也叫做网址。 4. HTTP协议简介: 一、TCP/IP 协议介绍 在介绍 HTTP 协议之前,先简单说一下TCP/IP协议的相关内容。TCP/IP协议是分层的,从底层至应用层分别为:物理层、链路层、网络层、传输层和应用层,如下图所示: 从应用层至物理层,数据是一层层封装,封装的方式一般都是在原有数据的前面加一个数据控制头,数据封装格式如下: 其中,对于TCP传输协议,客户端在于服务器建立连接前需要经过TCP三层握手,过程如下: 二、HTTP协议 2.1 简介 超文本传输协议(Hypertext Transfer Protocol,简称HTTP)是应用层协议,自 1990 年起,HTTP 就已经被应用于 WWW 全球信息服务系统。 2.2 协议结构 HTTP协议格式也比较简单,格式如下: 2.3 HTTP 协议举例 下面是一个HTTP请求及响应的例子: 2.4 请求头格式 a) 通用头(general-header): b) 请求头(request-header): Accept-Encoding:客户端所能识别的编码压缩格式,如:“Accept-Encoding: gzip, deflate”; c) 实体头(entity-header): (此类头存在时要求有数据体) 2.5)响应格式 a) 通用头(general-header): b)响应头(response-header): c)实体头(entity-header): (此类头存在时要求有数据体) 2.6)服务器返回状态码 1xx:表明服务端接收了客户端请求,客户端继续发送请求; 举例: “100” ; 服务端希望客户端继续; 2.7)chunked 传输 编码使用若干个Chunk组成,由一个标明长度为0的chunk结束,每个Chunk有两部分组成,第一部分是该Chunk的长度(以十六进制表示)和长度单位(一般不写),第二部分就是指定长度的内容,每个部分用CRLF隔开。在最后一个长度为0的Chunk中的内容是称为footer的内容,是一些没有写的头部内容。另外,在HTTP头里必须含有:” Transfer-Encoding: chunked” 通用头字段。格式如下: 2.8)HTTP 请求方法 GET、POST、HEAD、CONNECT、PUT、DELETE、TRACE from:http://nicedayyep.javaeye.com/blog/89770 http请求方式总结 GET: 请求指定的页面信息,并返回实体主体。 正文部分的MIME类型: Http请求响应的正文部分可以是任意格式的数据,如何保证接收方能看得懂发送方发送的数据呢?http协议采用MIME协议来规范正文的数据格式。 MIME协议由W3C组织制定,RFC2045文档对MIME协议作了详细阐述。 MIME(Multipurpose Internet Mail Extension)是指多用途网络邮件拓展协议,这里的邮件不单纯是指E-Mail,还可以包括通过各种应用层协议在网络上传输的数据。因此,HTTP协议中的请求正文和响应正文可以看做是邮件。 遵守了MIME协议的数据类型统称为MIME类型。在Http请求头和http响应头中都有一个Content-type项,用来指定请求正文部分或响应正文部分的MIME类型。 如下表列出了常见的MIME类型与文件拓展名之间的对应关系。 http://www.w3school.com.cn/media/media_mimeref.asp 5. 用java套接字创建HTTP客户与服务器程序 package server; import java.io.*; import java.net.*; public class HTTPServer { public static void main(String args[]) { int port; ServerSocket serverSocket; try { port = Integer.parseInt(args[0]); } catch (Exception e) { // TODO: handle exception System.out.println("port = 8080 (默认)"); port = 8080; } try { serverSocket = new ServerSocket(port); System.out.println("服务器正在监听端口:"+serverSocket.getLocalPort()); while (true) { try { final Socket socket = serverSocket.accept(); System.out.println("建立一个新的TCP连接,该客户端的地址为:"+socket.getInetAddress()+":"+socket.getPort()); service(socket); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } } catch (Exception e) { // TODO: handle exception } } private static void service(Socket socket) throws Exception { // TODO Auto-generated method stub InputStream socketIn = socket.getInputStream(); Thread.sleep(500); int size = socketIn.available(); byte[] buffer = new byte[size]; socketIn.read(buffer); String request = new String(buffer); System.out.println(request); String firstLineOfRequest = request.substring(0,request.indexOf("\r\n")); String[] parts = firstLineOfRequest.split(" "); String uri = parts[1]; String contentType; if(uri.indexOf("html")!=-1||uri.indexOf("htm")!=-1) { contentType = "text/html"; } else if(uri.indexOf("jpg")!=-1||uri.indexOf("jpeg")!=-1) { contentType = "image/jpeg"; } else if(uri.indexOf("gif")!=-1) { contentType = "image/gif"; } else { contentType = "application/octet-stream"; } String responseFirstLine = "HTTP/1.1 200 OK \r\n"; String responseHeader = "Content-Type:"+contentType+"\r\n\r\n"; InputStream in = HTTPServer.class.getResourceAsStream("root/"+uri); OutputStream socketOut = socket.getOutputStream(); socketOut.write(responseFirstLine.getBytes()); socketOut.write(responseHeader.getBytes()); int len = 0; buffer = new byte[128]; while ((len=in.read(buffer))!=-1) { socketOut.write(buffer,0,len); Thread.sleep(1000); socket.close(); } } } 客户端程序 package client; import java.net.*; import java.io.*; import java.util.*; public class HTTPClient { public static void main(String args[]) { String uri = "index.htm"; if(args.length!=0) { uri = args[0]; } doGet("localhost",8080,uri); } private static void doGet(String host, int port, String uri) { // TODO Auto-generated method stub Socket socket = null; try { socket = new Socket(host,port); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } try { StringBuffer sb = new StringBuffer("GET " + uri + "HTTP/1.1 \r\n"); sb.append("Accept:*/*\r\n"); sb.append("Accept-Lanagee:zh-ch\r\n"); sb.append("Accept-Encoding:gzip,deflate\r\n"); sb.append("User-Agent:HTTPClient\r\n"); sb.append("Hosty:localhost:8080\r\n"); sb.append("Connetino:Keep-Alive\r\n\r\n"); OutputStream socketOut = socket.getOutputStream(); socketOut.write(sb.toString().getBytes()); Thread.sleep(2000); InputStream socketIn = socket.getInputStream(); int size = socketIn.available(); byte[] buffer = new byte[size]; socketIn.read(buffer); System.out.println(new String(buffer)); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } finally { try { socket.close(); } catch (Exception e2) { // TODO: handle exception e2.printStackTrace(); } } } } 6. Tomcat的组成结构 Tomcat 本身由一系列可配置的组件构成,其中核心组件是Servlet容器组件,他是所有其他Tomcat组件的顶层容器。为了叙述的方便,本书用 a) Server顶层类元素:一个配置文件中只能有一个Server元素,可包含多个Service b) Service 顶层类元素:本身不是容器,可包含一个Engine,多个Connector。 c) Connector 连接器类元素:代表通信接口。 d) Engine 容器类元素:为特定的Service组件处理所有客户请求,可包含多个Host。 e) Host 容器类元素:为特定的虚拟主机处理所有客户请求,可包含多个Context。 f) Context 容器类元素:为特定的Web应用处理所有客户请求。 g) 1 Server组件 一个Java Web application在Tomcat中与一个Context元素对应,也就是说一个Context元素定义了一个Java Web application,它们是一一对应的关系。 · 在一个Java Web应用中可以包含如下内容: ================== 一、TOMCAT的目录结构 /bin:存放windows或Linux平台上启动和关闭Tomcat的脚本文件 /conf:存放Tomcat服务器的各种全局配置文件,其中最重要的是server.xml和web.xml /doc:存放Tomcat文档 /server:包含三个子目录:classes、lib和webapps /server/lib:存放Tomcat服务器所需的各种JAR文件 /server/webapps:存放Tomcat自带的两个WEB应用admin应用和 manager应用 /common/lib:存放Tomcat服务器以及所有web应用都可以访问的jar文件 /shared/lib:存放所有web应用都可以访问的jar文件(但是不能被Tomcat服务器访问) /logs:存放Tomcat执行时的日志文件 /src:存放Tomcat的源代码 /webapps:Tomcat的主要Web发布目录,默认情况下把Web应用文件放于此目录 /work:存放JSP编译后产生的class文件 二、WEB应用的目录结构:假设在$CATALINA_HOME/webapps下有helloapp的web应用 /helloapp:Web应用的根目录,所有的jsp文件和html文件都在此目录下 /helloapp/WEB_INF:存放该web应用发布时的描述文件web.xml /helloapp/WEB_INF/class:存放各种class文件,Servlet文件也存放于此目录下 /helloapp/WEB_INF/lib:存放各钟Web应用所需要的jar文件。比如可以存放JDBC驱动程序的JAR文件 三、Tomcat加载类和资源的顺序为(以helloapp应用为例): 1、helloapp (/webapps/helloapp/Web-INF/下的classes,lib子目录中*.calss及*.jar,仅helloapp可以加载) 2、Bootstrap ($JAVA_HOME/jre/lib/ext/*.jar) 3、System ($CLASSPATH/*.class和CLASSPATH中指定的jar) 4、Common ($CATALINA_HOME/common/下的classes,lib,endores子目录中*.class及*.jar) 5、Catalina ($CATALINA_HOME/server/下的classes,lib子目录中*.calss及*.jar,仅Tomcat可以加载) 6、Shared ($CATALINA_HOME/shared/下的classes,lib子目录中*.calss及*.jar,仅所有Web应用可以加载) 四、$CATALINA_HOME/conf/server.xml配置简介 1、 port:指定一个端口,这个端口负责监听关闭tomcat的请求 shutdown:指定向端口发送的命令字符串,通常是“SHUTDOWN” 2、 name:指定service的名字,通常是”Catalina” 3、 port:指定服务器端要创建的端口号,并使用这个断口监听来自客户端的请求 minProcessors(考察是否有此属性):服务器端启动时创建的处理请求的线程数 maxProcessors(考察是否有此属性):最大可以创建的处理请求的线程数 maxThreads:服务器创建的最大线程数 minSpareThreads:最小剩余线程数 maxSpareThreads:最大剩余线程数 enableLookups:如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其IP地址 redirectPort:指定当服务器正在处理HTTP请求时收到了一个SSL传输请求后重定向的端口号 acceptCount:指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过的请求将不予处理 connectionTimeout:指定超时的时间数(以毫秒为单位) disableUploadTimeout:不明 debug:不明 protocol:不明 4、 name:指定Engine的名字,通常是”Catalina” defaultHost:指定默认的处理请求的主机名,至少与某个host元素的name属性值是相同的 5、 docBase:指定此Web应用的绝对或相对路径,也可以为WAR文件的路径 path:表示此Web应用程序的url的入口,如为“/hello“,则请求的URL为http://localhost:8080/hello/ reloadable:如果为true,则Tomcat在运行时会自动监视Web应用的/WEB-INF/lib和/WEB-INF/classes下文件的改动,自动装载新应用,使我们可以在不重启Tomcat的情况下更新Web应用 6、 name:指定虚拟主机名字 debug:指定日志级别 appBase:存放Web应用程序的基本目录,可以是绝对路径或相对于$CATALINA_HOME的目录,默认是$CATALINA_HOME/webapps unpackWARs:如果为true,则tomcat会自动将WAR文件解压后运行,否则不解压而直接从WAR文件中运行应用程序 autoDeploy:如果为true,表示Tomcat启动时会自动发布appBase目录下所有的Web应用(包括新加入的Web应用) deployOnStarup:如果此项为true,表示Tomcat服务器启动时会自动发布appBase目录下所有Web应用。如果Web应用在server.xml中没有相应的 alias:指定虚拟主机的别名,可以指定多个别名 xmlValidation:不明 xmlNamespaceAware:不明 7、 className:指定logger使用的类名,此类必须实现org.apache.catalina.Logger 接口 prefix:指定log文件名的前缀(文件名) suffix:指定log文件名的后缀(扩展名) timestamp:如果为true,则log文件名中会加入日期时间,如下例:localhost_log.2006-10-04.txt directory:指定log文件存放的目录 8、 className:指定Realm使用的类名,此类必须实现org.apache.catalina.Realm接口 resourceName:不明 9、 className:指定Valve使用的类名,如用org.apache.catalina.valves.AccessLogValve类可以记录应用程序的访问信息 directory:指定log文件存放的位置 pattern:有两个值,common方式记录远程主机名或ip地址、用户名、日期、第一行请求的字符串、HTTP响应代码、发送的字节数。combined方式比common方式记录的值还多
等来设定信息在浏览器中的展示格式简介
格式说明:
URL的组成
URL定位标识说明
URL结构说明
URL处理方式
统一资源定位器URL的作用
URL的缺点
简介
URL定位标识说明
URL结构说明
URL处理方式
统一资源定位器URL的作用
URL的缺点
史上,统一资源定位符的发明是一个非常基础的步骤。统一资源定位符的语法是一般的,可扩展的,它使用ASCII代码的一部分来表示因特网的地址。一般统一资源定位符的开始标志着一个计算机网络所使用的网络协议。
HTTP 是一种请求/响应式的协议。一个客户机与服务器建立连接后,发送一个请求给服务器;服务器接到请求后,给予相应的响应信息。
HTTP 的第一版本 HTTP/0.9是一种简单的用于网络间原始数据传输的协议;
HTTP/1.0由 RFC 1945 定义 ,在原 HTTP/0.9 的基础上,有了进一步的改进,允许消息以类 MIME 信息格式存 在,包括请求/响应范式中的已传输数据和修饰符等方面的信息;
HTTP/1.1(RFC2616) 的要求更加严格以确保服务的可靠性,增强了在HTTP/1.0 没有充分考虑到分层代理服务器、高速缓冲存储器、持久连接需求或虚拟主机等方面的效能;
安全增强版的 HTTP (即S-HTTP或HTTPS),则是HTTP协议与安全套接口层(SSL)的结合,使HTTP的协议数据在传输过程中更加安全。
Cache-Control:客户端希望服务端如何缓存自己的请求数据,如"Cache-Control: no-cache","Cache-Control: max-age=0";
Connection:客户端是否希望与服务端之间保持长连接,如"Connection: close", "Connection: keep-alive";
Date:只有当请求方法为POST或PUT方法时客户端才可能会有些字段;
Pragma:包含了客户端一些特殊请求信息,如 "Pragma: no-cache" 客户端希望代理或应用服务器不应缓存与该请求相关的结果数据;
Via:一般用在代理网关向应用服务器发送的请求头中,表明该来自客户端的请求经过了网关代理,
格式为:"Via: 请求协议版本 网关标识 [其它信息] ",
如 :" Via: 1.1 webcache_250_199.hexun.com:80 (squid)"
Accept: 表明客户同端可接受的请求回应的媒体类型范围列表。星号“*”用于按范围将类型分组,用“*/*”指示可接受全部类型;用“type/*”指示可接受type类型的所有子类型,如“ Accept: image/gif, image/jpeg, */*”;
Accept-Charset:客户端所能识别的字符集编码格式,格式:“Accept-Charset: 字符集1[:权重],字符集2[:权重]”,如:“ Accept-Charset: iso-8859-5, unicode-1-1;q=0.8”;
Accept-Language:客户端所能识别的语言,格式:“Accept-Language: 语言1[:权重],语言2[:权重]”,如:” Accept-Language: zh, en;q=0.7”;
Host:客户请求的主机域名或主机IP,格式:“Host: 域名或IP[:端口号]”,如:“Host: www.hexun.com:80“,请求行中若有HTTP/1.1则必须有该请求头;
User-Agent:表明用户所使用的浏览器标识,主要用于统计的目的;
Referer:指明该请求是从哪个关联连接而来;
If-Modified-Since:该字段与客户端缓存相关,客户端所访问的URL自该指定日期以来在服务端是否被修改过,如果修改过则服务端返回新的修改后的信息,如果未修改过则服务器返回304表明此请求所指URL未曾修改过,如:“If-Modified-Since: Fri, 2 Sep 2006 19:37:36 GMT”;
If-None-Match:该字段与客户端缓存相关,客户端发送URL请求的同时发送该字段及标识,如果服务端的标识与客户端的标识一致,则返回304表明此URL未修改过,如果不一致则服务端返回完整的数据信息,如:“If-None-Match: 0f0a893aad8c61:253, 0f0a893aad8c61:252, 0f0a893aad8c61:251”;
Cookie:为扩展字段,存储于客户端,向同一域名的服务端发送属于该域的cookie,如:“Cookie: MailUserName=whouse”;
Content-Encoding:客户端所能识别的编码压缩格式,如:“Content-Encoding: gzip, deflate”;
Content-Length:客户端以POST方法上传数据时数据体部分的内容长度,如:“ Content-Length: 24”;
Content-Type:客户端发送的数据体的内容类型,如:“Content-Type: application/x-www-form-urlencoded”为以普通的POST方法发送的数据;“Content-Type: multipart/form-data; boundary=---------------------------5169208281820”,则表明数据体由多部分组成,分隔符为“-----------------------------5169208281820”;
Cache-Control:服务端要求中间代理及客户端如何缓存自己响应的数据,如“Cache-Control: no-cache”,如:“Cache-Control: private” 不希望被缓存,“Cache-Control: public”可以被缓存;
Connection:服务端是否希望与客户端之间保持长连接,如“Connection: close”, “Connection: keep-alive”;
Date:只有当请求方法为POST或PUT方法时客户端才可能会有些字段;
Pragma:包含了服务端一些特殊响应信息,如 “Pragma: no-cache” 服务端希望代理或客户端不应缓存结果数据;
Transfer-Encoding:服务端向客户端传输数据所采用的传输模式(仅在HTTP1.1中出现),如:“Transfer-Encoding: chunked”,注:该字段的优先级要高于“Content-Length” 字段的优先级;
Accept-Ranges:表明服务端接收的数据单位,如:“Accept-Ranges: bytes”, ;
Location:服务端向客户端返回此信息以使客户端进行重定向,如:“Location: http://www.hexun.com”;
Server:服务端返回的用于标识自己的一些信息,如:“ Server: Microsoft-IIS/6.0”;
ETag:服务端返回的响应数据的标识字段,客户端可根据此字段的值向服务器发送某URL是否更新的信息;
Content-Encoding:服务端所响应数据的编码格式,如:“Content-Encoding: gzip”;
Content-Length:服务端所返回数据的数据体部分的内容长度,如:“ Content-Length: 24”;
Content-Type:服务端所返回的数据体的内容类型,如:“Content-Type: text/html; charset=gb2312” ;
Set-Cookie:服务端返回给客户端的cookie数据,如:“ Set-Cookie: ASP.NET_SessionId=icnh2ku2dqlmkciyobgvzl55; path=/”
2xx:客户端发送的请求被服务端成功接收并成功进行了处理;
3xx:服务端给客户端返回用于重定向的信息;
4xx:客户端的请求有非法内容;
5xx:服务端未能正常处理客户端的请求而出现意外错误。
“200” ; 服务端成功接收并处理了客户端的请求;
“301” ; 客户端所请求的URL已经移走,需要客户端重定向到其它的URL;
“304” ; 客户端所请求的URL未发生变化;
“400” ; 客户端请求错误;
“403” ; 客户端请求被服务端所禁止;
“404” ; 客户端所请求的URL在服务端不存在;
“500” ; 服务端在处理客户端请求时出现异常;
“501” ; 服务端未实现客户端请求的方法或内容;
“502” ; 此为中间代理返回给客户端的出错信息,表明服务端返回给代理时出错;
“503” ; 服务端由于负载过高或其它错误而无法正常响应客户端请求;
“504” ; 此为中间代理返回给客户端的出错信息,表明代理连接服务端出现超时。HTTP客户请求数据格式
HTTP客户请求数据格式
大多数servlet程序都是和浏览器客户以HTTP协议进行通信的,这需要编程人员对程序的基本功能和HTTP协议的具体操作有深入的理解。在学习servlet和Jsp编程时,有两点值得注意:首先是对HTTP协议的操作过程和数据格式足够熟悉,其次要灵活应用servlet的API中的有关方法正确高效地处理有关数据。
一、HTTP客户请求的数据格式说明
HTTP请求包括三部分:请求行(Request Line),头部(Headers)和数据体(Body)。其中,请求行由请求方法(method),请求网址Request-URI和协议 (Protocol)构成,而请求头包括多个属性,数据体则可以被认为是附加在请求之后的文本或二进制文件。
下面这个例子显示了一个HTTP请求的Header内容,这些数据是真正以网络HTTP协议从IE浏览器传递到Tomcat服务器上的。
GET /icwork/? search=product HTTP/1.1
Accept:image/gif,image/x-xbitmap,image/jpeg,image/pjpeg,application/vnd.ms-powerpoint,application/vnd.ms-excel,application/msword,*.*
Accept-Language:en-us
Accept-Encoding:gzip,deflate
User-Agent:Mozilla/4.0(compatible;MSIE 5.01;Windows NT 5.0;DigExt)
Host:www.icconcept.com:8080
Referer:http://www.yoursite.com/header.html
Connection:Keep-Alive
这段程序使用了6个Header,还有一些Header没有出现。我们参考这个例子具体解释HTTP请求格式。
1.HTTP请求行:请求行格式为Method Request-URI Protocol。在上面这个例子里,“GET /icwork/? search=pruduct HTTP/1.1”是请求行。
2.Accept:指浏览器或其他客户可以接爱的MIME文件格式。Servlet可以根据它判断并返回适当的文件格式。
3.Accept-Charset:指出浏览器可以接受的字符编码。英文浏览器的默认值是ISO-8859-1.
4.Accept-Language:指出浏览器可以接受的语言种类,如en或en-us,指英语。
5.Accept-Encoding:指出浏览器可以接受的编码方式。编码方式不同于文件格式,它是为了压缩文件并加速文件传递速度。浏览器在接收到Web响应之后先解码,然后再检查文件格式。
6.Authorization:当使用密码机制时用来标识浏览器。
7.Cache-Control:设置关于请求被代理服务器存储的相关选项。一般servlet用不到。
8.Connection:用来告诉服务器是否可以维持固定的HTTP连接。HTTP/1.1使用Keep-Alive为默认值,这样,当浏览器需要多个文件时(比如一个HTML文件和相关的图形文件),不需要每次都建立连接。
9.Content-Type:用来表名request的内容类型。可以用HttpServletRequest的getContentType()方法取得。
10.Cookie:浏览器用这个属性向服务器发送Cookie。Cookie是在浏览器中寄存的小型数据体,它可以记载和服务器相关的用户信息,也可以用来实现会话功能。
11.Expect:表时客户预期的响应状态。
12.From:给出客户端HTTP请求负责人的email地址。
13.Host:对应网址URL中的Web名称和端口号。
14.If-Match:供PUT方法使用。
15.If-Modified-Since:客户使用这个属性表明它只需要在指定日期之后更改过的网页。因为浏览器可以使用其存储的文件而不必从服务器请求,这样节省了Web资源。由于Servlet是动态生成的网页,一般不需要使用这个属性。
16.If-None-Match:和If-Match相反的操作,供PUT方法使用。
17.If-Unmodified-Since:和If-Match-Since相反。
18.Pragma:这个属性只有一种值,即Pragma:no-cache,表明如果servlet充当代理服务器,即使其有已经存储的网页,也要将请求传递给目的服务器。
19.Proxy-Authorization:代理服务器使用这个属性,Servlet一般用不到。
20.Range:如果客户有部分网页,这个属性可以请求剩余部分。
21.Referer:表明产生请求的网页URL。如比从网页/icconcept/index.jsp中点击一个链接到网页/icwork/search,在向服务器发送的GET/icwork/search中的请求中,Referer是http://hostname:8080/icconcept/index.jsp。这个属性可以用来跟踪Web请求是从什么网站来的。
22.Upgrage:客户通过这个属性设定可以使用与HTTP/1.1不同的协议。
23.User-Agent:是客户浏览器名称。
24.Via:用来记录Web请求经过的代理服务器或Web通道。
25.Warning:用来由客户声明传递或存储(cache)错误。
补充.Transfer-Encoding:
当不能预先确定报文体的长度时,不可能在头中包含Content-Length域来指明报文体长度,此时就需要通过Transfer-Encoding域来确定报文体长度。
通常情况下,Transfer-Encoding域的值应当为chunked,表明采用chunked编码方式来进行报文体的传输。chunked编码是HTTP/1.1 RFC里定义的一种编码方式,因此所有的HTTP/1.1应用都应当支持此方式。
chunked编码的基本方法是将大块数据分解成多块小数据,每块都可以自指定长度
二、下面是一个分析并显示客户请求的Header信息的servlet(tomcat下测试通过):
java 代码
Code:
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.Enumeration;
public class headerinfo extends HttpServlet{
public void doPost(HttpServletRequest req,HttpServletResponse resp)
throws ServletException,IOException
{
/*
Enumeration e = req.getHeaderNames();
while (e.hasMoreElements()) {
String s = (String) e.nextElement();
System.out.println("header: " + s + " " + req.getHeader(s));
}
e = req.getAttributeNames();
while (e.hasMoreElements()) {
String s = (String) e.nextElement();
System.out.println("attribute: " + s + " " + req.getAttribute(s));
}
e = req.getParameterNames();
while (e.hasMoreElements()) {
String s = (String) e.nextElement();
System.out.println("parameter: " + s + " " + req.getParameter(s));
}*/
resp.setContentType("text/html; charset=GBK");
PrintWriter out = resp.getWriter();
out.println("
out.println("");
out.println("
out.println("List of all Headers in Servlet Request");
out.println("
out.println("
");
out.println("Request Line is:
");
out.println("Method:"+req.getMethod()+"
");
out.println("URI:"+req.getRequestURI()+"
");
out.println("Protocol"+req.getProtocol()+"
");
out.println("Header Name and Values
out.println("");
");
out.println(" "); Name value
Enumeration headernames = req.getHeaderNames();
while(headernames.hasMoreElements()){
String headername = (String)headernames.nextElement();
out.println(" "); "+headername+" "+req.getHeader(headername)+"
}
out.println("
out.flush();
}
public void doGet(HttpServletRequest req,HttpServletResponse resp)
throws ServletException,IOException
{
doPost(req,resp);
}
}
HEAD: 只请求页面的首部。
POST: 请求服务器接受所指定的文档作为对所标识的URI的新的从属实体。
PUT: 从客户端向服务器传送的数据取代指定的文档的内容。
DELETE: 请求服务器删除指定的页面。
OPTIONS: 允许客户端查看服务器的性能。
TRACE: 请求服务器在响应中的实体主体部分返回所得到的内容。
PATCH: 实体中包含一个表,表中说明与该URI所表示的原内容的区别。
MOVE: 请求服务器将指定的页面移至另一个网络地址。
COPY: 请求服务器将指定的页面拷贝至另一个网络地址。
LINK: 请求服务器建立链接关系。
UNLINK: 断开链接关系。
WRAPPED: 允许客户端发送经过封装的请求。
Extension-mothed:在不改动协议的前提下,可增加另外的方法。
比如:
GET /index.html HTTP/1.1
Accept: text/plain /*纯ASCII码文本文件*/
Accept: text/html /*HTML文本文件*/
User-Agent:Mozilla/4.5(WinNT)
说明浏览器使用Get方法请求文档/index.html。浏览器则只允许接收纯ASCII码文本文件和HTML文本文件,其使用的引擎是Mozilla/4.5(Netscape)。
Server组件对应
.2 Service组件
Service组件是一些Connector组件的集合,它本身不是一个容器,所以在这里不能定义日志等组件。一个Service组件中只能有一个Engine组件,可以包含多个Connector组件。
.3 Connector组件
Connector组件表示一个接口,通过这个接口接收客户的请求,然户发送给其他的容器组件,最后再把服务器的响应结果传递给客户。
.4容器类元素
上面介绍的3个组件本身并不能处理客户请求,也不能生成响应。在Tomcat中只有3个组件是可以处理客户请求并生成响应的,这3个组件分别是Engine、Host和Context组件。这3个组件分别代表了不同的服务范围,通过嵌套关系可以知道3个组件的范围有如下的关系:Engine>Host>Context。
Engine组件下可以包含多个Host组件,它为特定的Service组件处理所有客户请求。
一个Host组件代表一个虚拟主机,一个虚拟主机中可以包含多个Web应用(Context组件)。
Context组件代表一个Web应用。
Tomcat的各个组件关系,可以用下图描述。
Servlet
JSP页面
Java类
静态资源(HTML文档、图片等)
描述Web应用的描述文件
客户每次提出请求时指定要访问的资源,如果客户没有指定具体资源,Tomcat使用默认的资源响应客户,显示文件夹中的资源列表或者提示错误。