write:2022-4-10
1. Web的概念,特点
1.1 Web的概念
Web是一种分布式应用架构,旨在共享分布在网络上的各个Web服务器中所有互相链接的信息。Web采用客户/服务器通信模式,客户与服务器之间用HTTP协议通信。Web使用超级文本技术(HTML)来链接网络上的信息。信息存放在服务器端,客户机通过浏览器(例如IE 或 Netscape)就可以查找网络中各个Web服务器上的信息。
基于HTTP通信协议的服务器称为Web服务器
Web服务器中存放的用HTML编写的各种信息称为Web文档
用来访问Web服务器上的文档资源的客户端为浏览器
1.2 World Wide Web的概念
WWW是指全球范围内的Web,它以Internet作为网络平台, Internet是来自世界各地的众多相互联接的计算机和其他设备的集合,而WWW则是Internet上的一种分布式应用架构。
1.3 Web的技术特征
- 信息的表示:用超级文本技术HTML(超级文本标记语言)来表达信息,以及建立信息与信息的链接。
- 信息的定位:用统一资源定位技术URL来实现网络上信息的精确定位。
URL的格式如下:应用层协议://主机IP地址或域名/资源所在路径/文件名 - 信息额传输:用网络应用层协议HTTP来规范浏览器与Web服务器之间的通信过程。
- 示意图:
1.4 Web的特点
- Web是一种超媒体系统
超文本/超媒体/链接 - Web是图形化的和易于导航的
只需从一个链接跳到另一个链接就可在各页各站点间进行浏览 - Web与平台无关
从Windows、UNIX、Macintosh等都可以访问Web - Web是分布式的
物理上不一定在一个站点的信息在逻辑上一体化,从用户来看这些信息是一体的 - Web 是动态的和交互的
信息的提供者可以经常的对站上的信息进行更新
用户通过填写FORM可以向服务器提交请求,服务器可以根据用户的请求返回相应信息 - 浏览器作为各种系统通用的客户端软件,给用户提供了统一的图形化界面,减少用户在学习新软件方面所遇到的困难。任何浏览器均支持WWW所用的HTTP协议和HTML语言
1.5 Web带来的革命
发布信息,开展业务
提供了全球的链接
为商业竞争创造了全新的竞争领域
用户可以掌握一切,扩大了客源。(客户自助服务)
提供了一种更新、更好的方式来完成已有的服务
基于Web的信息交换改善了商业伙伴之间的合作,优化物流、简化书面工作、减少供应链开销
使用内部互联网(Intranet)来共享信息,优化内部流程,在竞争中争取主动
2. HTTP协议简介
2.1 HTTP协议在TCP/IP体系中的位置
Internet的基本协议是TCP/IP协议,然而在TCP/IP模型最上层的是应用层(Application layer),它包含所有高层的协议。高层协议有:文件传输协议FTP、电子邮件传输协议SMTP、域名系统服务DNS、网络新闻传输协议NNTP和HTTP协议等。
2.2 HTTP协议概念
HTTP协议(Hypertext Transfer Protocol,超文本传输协议)是用于从Web服务器传输超文本到本地浏览器的传送协议。
HTTP的第一个版本是HTTP/0.9,后来发展到了HTTP/1.0,现在最新的版本是HTTP/1.1。HTTP/1.1在 RFC 2616 中定义。关于HTTP/1.1的详细资料可以参考HTTP/1.1链接。补充:另外,新的HTTP2.0也在试点普及阶段,它采用了安全加密技术。
2.3 HTTP协议规定的运作方式
信息交换分四个过程,建立连接、发送请求信息、发送响应信息、关闭连接。
2.4 HTTP协议的特点
- HTTP协议是一种基于请求/响应模式的协议。客户端发送一个请求,服务器返回对该请求的响应。HTTP协议使用可靠的TCP连接,默认端口是80。
- 在HTTP中,客户端/服务器之间的通信总是由客户端通过建立连接和发送HTTP请求开始,服务器不会主动联系客户端或要求与客户端建立连接。(注意:一次ftp连接只可发送一个请求。意思是每一个HTTP请求对应一个单独的ftp连接。提示:这里提到的FTP连接是指以传输文件为目的的连接。FTP是File Transfer Protocol (文件传输协议)的英文简称,用于Internet.上的文件的双向传输。)在通信开始后,浏览器或服务器都可以随时中断连接,例如,在访问网页时你可以随时点击“停止”按钮中断当前的文档下载过程,关闭与Web服务器的连接。
2.5 HTTP请求和响应
HTTP协议不仅规定了浏览器与Web服务器的通信过程,而且对HTTP请求和响应的数据格式作了具体的规定。
2.5.1 HTTP请求的具体格式
由三个部分构成,分别是:
请求方式 URI 协议/版本
请求头(Request Header):可有若干行
请求正文:与请求头用空行隔开,也可以是任意格式的数据:图片,声音,视频,可执行程序等
eg:一个HTTP请求的例子:
解析如下:
- 请求的第一行是“方式 URI 协议/版本”:
POST /hello.jsp HTTP/1.1
(请求方式)(URI) (协议和协议的版本)
根据HTTP标准,HTTP请求可以使用多种请求方式。例如,HTTP 1.1支持七种请求方式:GET、POST、HEAD、OPTIONS、PUT、DELETE和TRACE。在Internet应用中,最常用的请求方式是GET和POST。
URI完整地指定了要访问的网络资源,通常只要给出相对于服务器的根目录的相对目录即可,因此总是以“/”开头。最后,协议版本声明了通信过程中使用的HTTP协议的版本。 - 请求头(Request Header):
请求头包含许多有关客户端环境和请求正文的有用信息(给服务器端看的)。例如,请求头可以声明浏览器所用的语言,请求正文的长度等等。
Accept: image/gif, image/jpeg, /
Referer: http://localhost/login.htm
Accept-Language: en,zh-cn;q=0.5 //浏览器所用的语言
Content-Type: application/x-www-form-urlencoded //正文类型
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0) //浏览器类型
Host: localhost //远程主机
Content-Length: 40 //正文长度
Connection: Keep-Alive
Cache-Control: no-cache
- 请求正文:
请求头和请求正文之间是一个空行(只有CRLF(换行符,Carriage Return,Line Feed)符号的行),这个行非常重要,它表示请求头已经结束,接下来的是请求的正文。请求正文中可以包含客户提交的请求参数信息:
username=Tom&password=1234&submit=submit
在以上例子的HTTP请求中,请求的正文只有一行内容。当然,在实际应用中,HTTP请求正文可以包含更多的内容。
2.5.1 HTTP响应的具体格式
和HTTP请求相似,也由三个部分构成,分别是:
协议/版本 状态代码 描述
响应头(Response Header)
响应正文
eg:一个HTTP响应的例子:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-type: text/html; charset=GBK
Content-length: 102
hello
解析如下:
- 协议/版本 状态代码 (对状态代码的)描述
HTTP/1.1 200 OK
状态码用于指示服务器端对客户端请求的处理情况,状态码是三位的整数,有以下情况:
200 OK 客户端请求成功
400 BadRequest 由于客户端请求有语法错误,不能被服务器所理解。
404 NotFound 请求的资源不存在,例如,输入了错误的URL。
405 Not Support 不支持的请求
500 Internal Server Error 服务器发生不可预期的错误,导致无法完成客户端的请求。 - 响应头:
响应头也和请求头一样包含许多有用的信息,例如服务器类型、日期时间、响应正文的类型和长度等。
Server: Apache-Coyote/1.1 //响应类型
Content-type: text/html; charset=GBK
Content-length: 102
3.响应正文:
响应正文就是服务器返回的具体数据,它是浏览器真正请求访问的信息,最常见的是HTML文档 。(也可以是任意格式的数据)
hello
响应头和正文之间也必须用空行分隔。
3. 用Java Socket实现HTTP Server/Client
3.1 HTTP Server/Client通信原理
实际上,由于Web服务器与浏览器之间使用HTTP协议通信,因此Web服务器也可以叫做HTTP服务器,浏览器也可以成为HTTP客户程序
Socket:套接字,建立在TPC/IP协议基础之上,java通过Socket来进行网络通信
3.2 简单案例
源码:java web使用Socket通信简单案例,源码免费!
HTTPServer.class:
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) {
System.out.println("port = 8080 (默认)");
port = 8080; //默认端口为8080
}
try{
serverSocket = new ServerSocket(port);
System.out.println("服务器正在监听端口:" + serverSocket.getLocalPort());
while(true) { //服务器在一个无限循环中不断接收来自客户的TCP连接请求
try{
//等待客户的TCP连接请求
final Socket socket = serverSocket.accept();
System.out.println("建立了与客户的一个新的TCP连接,该客户的地址为:"+
socket.getInetAddress()+":" + socket.getPort());
service(socket); //响应客户请求
}catch(Exception e){e.printStackTrace();}
} //#while
}catch (Exception e) {e.printStackTrace();}
}
/** 响应客户的HTTP请求 */
public static void service(Socket socket)throws Exception{
/*读取HTTP请求信息*/
InputStream socketIn=socket.getInputStream(); //获得输入流
Thread.sleep(500); //睡眠500毫秒,等待HTTP请求
int size=socketIn.available();
byte[] requestBuffer=new byte[size];
socketIn.read(requestBuffer);
String request=new String(requestBuffer);
System.out.println(request); //打印HTTP请求数据
/*解析HTTP请求*/
//获得HTTP请求的第一行
String firstLineOfRequest=request.substring(0,request.indexOf("\r\n"));
//解析HTTP请求的第一行
String[] parts=firstLineOfRequest.split(" ");
String uri=parts[1]; //获得HTTP请求中的uri
/*决定HTTP响应正文的类型*/
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";
/*创建HTTP响应结果 */
//HTTP响应的第一行
String responseFirstLine="HTTP/1.1 200 OK\r\n";
//HTTP响应头
String responseHeader="Content-Type:"+contentType+"\r\n\r\n";
//获得读取响应正文数据的输入流
InputStream in=HTTPServer.class.getResourceAsStream("root/"+uri);
/*发送HTTP响应结果 */
OutputStream socketOut=socket.getOutputStream(); //获得输出流
//发送HTTP响应的第一行
socketOut.write(responseFirstLine.getBytes());
//发送HTTP响应的头
socketOut.write(responseHeader.getBytes());
//发送HTTP响应的正文
int len=0;
byte[] buffer=new byte[128];
while((len=in.read(buffer))!=-1)
socketOut.write(buffer,0,len);
Thread.sleep(1000); //睡眠1秒,等待客户接收HTTP响应结果
socket.close(); //关闭TCP连接
}
}
HTTPClinet.class:
package client;
import java.net.*;
import java.io.*;
import java.util.*;
public class HTTPClient {
public static void main(String args[]){
//确定HTTP请求的uri
String uri="index.htm";
if(args.length !=0)uri=args[0];
doGet("localhost",8080,uri); //按照GET请求方式访问HTTPServer
}
/** 按照GET请求方式访问HTTPServer */
public static void doGet(String host,int port,String uri){
Socket socket=null;
try{
socket=new Socket(host,port); //与HTTPServer建立FTP连接
}catch(Exception e){e.printStackTrace();}
try{
/*创建HTTP请求 */
StringBuffer sb=new StringBuffer("GET "+uri+" HTTP/1.1\r\n");
sb.append("Accept: */*\r\n");
sb.append("Accept-Language: zh-cn\r\n");
sb.append("Accept-Encoding: gzip, deflate\r\n");
sb.append("User-Agent: HTTPClient\r\n");
sb.append("Host: localhost:8080\r\n");
sb.append("Connection: Keep-Alive\r\n\r\n");
/*发送HTTP请求*/
OutputStream socketOut=socket.getOutputStream(); //获得输出流
socketOut.write(sb.toString().getBytes());
Thread.sleep(2000); //睡眠2秒,等待响应结果
/*接收响应结果*/
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){
e.printStackTrace();
}finally{
try{
socket.close();
}catch(Exception e){e.printStackTrace();}
}
} //#doGet()
}
3.3 运行案例
可以有以下四种运行方式:
3.3.1 HTTPClient客户程序访问HTTPServer程序
HTTPServer服务器:
HTTPClient客户端:
3.3.2 IE浏览器访问HTTPServer程序
运行HTTPServer:
在浏览器输入并运行:注意:浏览器会对响应结果进行解析,以图形界面的方式呈现出来
3.3.3 HTTPClient客户程序访问Tomcat服务器
Tomcat:此处可看做一个开源服务器,默认监听窗口:8080
3.3.4 IE浏览器访问Tomcat服务器
4. Web的演变
第一个阶段:发布静态HTML文档。(只有图片和信息)
第二个阶段:发布静态多媒体信息。
第三个阶段:提供浏览器端与用户的动态交互功能。
第四个阶段:提供服务器端与用户的动态交互功能。
第五个阶段:发布基于Web的应用程序,即Web应用。
第六个阶段:发布Web服务。
第七个阶段:推出Web2.0,它是全民共建的Web。(用户既是web信息的消费者,也是web信息的制造者)
4.1 Web技术的发展过程
4.2 Web应用的特点
基于Web的应用,简称为Web应用
- 以浏览器作为展示客户端界面的窗口。
- 客户端界面一律表现为网页形式,网页由HTML语言写成,具有交互功能。
- 能完成与桌面应用程序类似的功能。
- 使用浏览器-服务器架构,浏览器与服务器之间采用HTTP协议通信。
- Web应用通过Web服务器来发布。
4.3 Web应用如何工作
-
处理静态 Web 页
静态页面是事先存放在服务器端的文件系统中的文档(即在自身资源文件系统中查找即可)
-
处理动态 Web 页
动态页面事先并不存在与文件系统中,动态页面是当服务器处理客户请求时动态执行特定程序代码产生的。
对于Java Web应用,被动态执行的程序代码位于Servlet中。
-
访问数据库
5. Web服务
5.1 Web服务发展的原动力
- 电子商务和企业应用集成的发展:
从局部化发展到全球化
从B2C(Bussiness-to-Customer)发展到B2B(Bussiness-to-Bussiness)
从集中式发展到分布式 - 需要解决语言差异、平台差异、协议差异、数据差异所带来的高代价的系统集成
5.2 Web服务架构
简单地理解,Web服务可看作是被客户端远程调用的各种方法,这些方法能处理特定业务逻辑,或者进行复杂运算等等。
注意:Web服务的响应结果就不再是一个HTML页面。
5.3 Web服务采用SOAP协议通信
SOAP协议与HTTP协议都基于请求/响应模式;
SOAP请求:客户端要求访问特定的Web服务的请求,SOAP响应:服务器端返回的Web服务的响应结果
SOAP请求和SOAP响应都是基于XML格式的数据,都需要在网络上进行传输;
其实HTTP协议不仅仅能够传输HTML文档,还可以传输其他任意格式的数据,因此,可把SOAP请求数据和SOAP响应数据统国HTTP协议进行网络上的传输,所以SOAP协议可以建立在HTTP协议的基础之上;
SOAP(Simple Object Access Protocol)协议
SOAP协议规定客户与服务器之间一律用XML语言进行通信。
SOAP协议规定了客户端向服务器端发送的Web服务请求的具体数据格式,以及服务器端向客户端发送的Web服务响应结果的具体数据格式。
eg:
假定服务器端有个Web服务(对应getTime()方法)能返回当前的系统时间,一个客户程序请求访问这个Web服务,以下是服务器端返回的Web服务响应结果:
<soapenv:Envelope xmlns:soapenv=“http://schemas.xmlsoap.org/soap/envelope/”
xmlns:xsd=“http://www.w3.org/2001/XMLSchema”
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”>
soapenv:Body //包含响应结果的主题内容
2008年01月26日 11:33
</soapenv:Body>
</soapenv:Envelope>
5.4 Web服务搭坐Web顺风车的基本原理
思想:把SOAP请求/SOAP响应包装为HTTP请求/HTTP响应,然后在网络上传输,即搭顺风车;
6. 练习题
-
问题:HTML与浏览器是什么关系?
选项:
(A) 浏览器是HTML的编辑器,可以用浏览器来编写HTML页面
(B)浏览器是HTML的解析器,能够解析HTML文件,并图形化的展示网页
©浏览器是HTML的编译器和运行器,能够把HTML文件编译成可执行文件,然后执行它。
答案:B -
问题:以下哪些属于Web服务器端编程技术?
选项:
(A) ASP
(B)ASP.NET
©Flash
(D)JSP/Servlet
(E)HTML
(F)JavaScript
(G)CGI
(H)PHP
答案:A,B,D,G,H -
问题:B/S结构与C/S结构相比,有什么优点?
选项:
(A) B/S比C/S更安全 (B/S需要在互联网上传输数据,安全性更差)
(B) B/S可以降低客户培训费用。 (因为B/S客户端是浏览器)
©B/S对客户机具有较低的要求。
(D)B/S具有更快的响应速度。
(E) B/S易于在异构平台上配置集成。
(F)B/S比C/S更容易创建复杂的界面。
答案:B,C,E
注意:B/S结构:浏览器/服务器结构,web应用所采用的架构;C/S结构:客户端/服务器架构,传统的桌面应用程序采用的架构;
(A) B/S比C/S更安全 (B/S需要在互联网上传输数据,安全性更差,C/S比B/S更安全)
(B) B/S可以降低客户培训费用。 (B/S客户端是浏览器,对客户要求更低,对C/S开发的应用程序,每个应用程序都有不同的客户端界面)
©B/S对客户机具有较低的要求。
(D)B/S具有更快的响应速度。 (B/C架构建立在互联网基础上,而互联网的数据传输速度通常没有保证,C/S具有更快的响应速度)
(E) B/S易于在异构平台上配置集成。(B/S只要遵循HTTP协议即可通信)
(F)B/S比C/S更容易创建复杂的界面。 (B/S用HTML语言创建界面,而HTML语言标签有限,因此创建界面能力具有较大的局限性,C/S创建界面更灵活) -
问题:以下关于HTTP的说法,哪些是正确的?
选项:
(A) HTTP协议规定了HTML的语法。
(B)HTTP协议是由Microsoft公司制定的。
© 浏览器与Web服务器之间的通信遵循HTTP协议。
(D)HTTP是Hypertext Transfer Protocol的缩写。
答案:C,D
注意:(A)HTTP协议规定了HTML的语法。(彼此独立的)
(B)HTTP协议是由Microsoft公司制定的。(HTTP协议有W3C组织制定的) -
问题:以下哪些属于标记语言?
选项:
(A) HTML
(B)Java
© JSP
(D) XML
(E) JavaScript
答案:A,D
注意:(A) HTML
(B)Java
© JSP(Web服务器端执行的程序代码)
(D) XML
(E) JavaScript (浏览器端运行的脚本) -
问题:用户在本地编写了一个index.htm文件,用IE浏览器打开它,如下图所示。 IE浏览器打开index.htm文件时,需要先发出一个HTTP请求吗?
答:不会;打开的是本地的HTML文件,此时的浏览器仅仅充当一个HTML的解析器 -
问题:Web应用位于TCP/IP参考模型的哪一层?(单选)
选项:
a) 网络互联层
b) 应用层
c) 传输层
d) 主机-网络层
答案:b -
问题:关于SOAP协议,以下哪个说法正确?(单选)
选项:
(A)SOAP请求与SOAP响应采用HTML语言
(B)SOAP协议提供了定位Web服务的规范
©SOAP协议规定了客户端请求访问Web服务的数据格式。
(D)浏览器要求访问特定网页的请求必须遵守SOAP协议。
答案:C
注意:(A)SOAP请求与SOAP响应采用HTML语言 (XML语言)
(B)SOAP协议提供了定位Web服务的规范 (定位Web服务是UDDI协议)
©SOAP协议规定了客户端请求访问Web服务的数据格式。
(D)浏览器要求访问特定网页的请求必须遵守SOAP协议。(浏览器要求访问特定网页的请求及Web服务器的返回结果都应该遵守HTTP协议)