WEB的发展历程
一.WEB发展基础
Socket是一种通信机制,可以在多台电脑之间进行数据的传输,这是网络编程的开端和基础。
1.简单通信
Server:
/*
*服务器端,接收客户端请求并给出简单的响应
*/
public class Server {
public static void main(String[] args) throws IOException {
//1、创建服务器,指定端口ServerSocket(int port)
ServerSocket socket=new ServerSocket(8888);
//2、接收客户端连接
Socket client=socket.accept();
System.out.println("******************");
//获取数据的输入流
InputStream is=client.getInputStream();
//使用字符缓存流
BufferedReader br=new BufferedReader(new InputStreamReader(is));
String msg="";
while((msg=br.readLine())!=null){
System.out.println(msg);
}
br.close();
}
}
}
Client:
/*
* 客户端:向服务器发送请求,并发送简单的消息
*/
public class Client {
public static void main(String[] args) throws Exception{
//创建客户端,指定服务器和端口
Socket client = new Socket("localhost",8888);
//发送信息,请求资源,获取发送流
OutputStream os =client.getOutputStream();
BufferedWriter br = new BufferedWriter(new OutputStreamWriter(os));
//写出消息,发送内容
String msg = "I need some source";
br.write(msg);
br.close();
}
}
2.不同请求
Server:
public class Server2 {
public static void main(String[] args) throws Exception{
//创建绑定到特定端口的服务器套接字
ServerSocket server = new ServerSocket(8898);
//倾听并接受到此套接字的连接
Socket client = server.accept();
System.out.println("接收到连接");
InputStream is = client.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
byte[] req = new byte[1024];
//接收客户端请求
int len = bis.read(req);
String reqStr = new String(req,0,len);
System.out.println(reqStr);
if(reqStr.equals("money")) {
System.out.println("here's the money");
}
else if(reqStr.equals("time")) {
System.out.println("you have so much time");
}
client.close();
server.close();
}
}
Client:
public class Client2 {
public static void main(String[] args) throws Exception{
//通过系统默认类型的SocketImpl创建未连接套接字
Socket socket = new Socket();
//此类实现IP套接字(IP地址+端口号),它也可以是一个对(主机名+端口号),在此情况下,将尝试解析主机名
SocketAddress address = new InetSocketAddress("localhost",8898);
//将此套接字连接到服务器,并指定一个超时值(ms),或者不指定超时值
socket.connect(address, 1000);
OutputStream os = socket.getOutputStream();
os.write("time".getBytes());
os.flush();
socket.close();
}
}
3.复杂请求
Server:
public class Server3 {
public static void main(String[] args) throws Exception{
//创建绑定到特定端口的服务器套接字
ServerSocket server = new ServerSocket(8889);
//侦听并接受额到此套接字的连接
Socket client = server.accept();
System.out.println("接收到连接");
InputStream is = client.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
byte[] req = new byte[1024];
//接收客户端请求
int len = bis.read(req);
String reqStr = new String(req,0,len);
System.out.println(reqStr);
//将接收到的请求封装成对象,传送给请求的类
MyRequest request = new MyRequest();
MyResponse response = new MyResponse();
OutputStream os = client.getOutputStream();
if (reqStr.equals("money")) {
//根据请求的信息,构造处理的类
MyServlet s1= new ServletMoney();
s1.service(request,response);
//通过client的响应,将结果响应回客户端
os.write("here's the monry".getBytes());
os.flush();
}
else if (reqStr.equals("time")) {
MyServlet s2= new ServletMoney();
s2.service(request,response);
//通过client的响应,将结果响应回客户端
os.write("you have somuch time".getBytes());
os.flush();
}
client.close();
server.close();
}
}
//请求的标准
interface MyServlet{
void service(MyRequest req, MyResponse resp);
}
class ServletMoney implements MyServlet{
public void service(MyRequest req, MyResponse resp) {
//做出处理
}
}
class ServletTime implements MyServlet{
public void service(MyRequest req, MyResponse resp) {
//做出处理
}
}
class MyRequest{
}
class MyResponse{
}
Client:
public class Client3 {
public static void main(String[] args) throws Exception{
//通过系统默认类型的SocketImpl创建未连接套接字
Socket socket = new Socket();
SocketAddress address = new InetSocketAddress("localhost",8889);
socket.connect(address,1000);
OutputStream os = socket.getOutputStream();
os.write("money".getBytes());
os.flush();
//接收响应,显示结果
InputStream is = socket.getInputStream();
byte[] result = new byte[1024];
int len = is.read(result);
String resultStr = new String(result,0,len);
System.out.println(resultStr);
socket.close();
}
}
4.服务器
当客户端请求的资源越来越丰富,需求越来越复杂,程序的核心便放在了解决业务和计算数据上,因此产生了服务器,服务器统一接收客户端处理并分发到不同的资源,由各个资源进行处理,最后交由服务器响应。
目前市面上的服务器常用的有Tomcat, JBOOS, WebSphere, Apache等。
二.JavaWeb
JavaWeb是采用Java技术来解决相关web互联网领域的技术综合,包括服务器端和客户端。服务器端包含了Servlet, JSP和大量第三方框架,客户端则有java applet。
随着网络技术的发展,单机软件无法满足网络计算的需求,因此,各种网络程序开发体系应运而生,对于网络应用程序而言,有两类开发体系结构运用最多,分别是 B/S 结构和 C/S 结构
1.B/S体系结构
B/S全称Browser/Server,浏览器/服务器结构,在该结构中,客户端通过IE,Chrome等浏览器向Web服务器发送请求,Web服务器进行处理,并将处理结果逐级发送回客户端。这一结构借助浏览器实现了需要复杂专用的软件才能实现的计算功能,减少了开发成本,是当今应用软件的首选体系结构。
2.C/S体系结构
C/S全程Client/Server,客户端/服务器,该结构中,服务器被设置在PC或者工作站中,并采用大型的数据库系统,而客户端则是通过专门开发的客户端软件运行在计算机中。这类结构借助双方的硬件,将任务分配给双方,减少中间的通信开销,是早期网络程序开发的主流。
三.Web应用程序
1.Web应用程序的工作原理
Web应用程序大体上分为静态网站和动态网站。
静态网站指通过静态页面,用户直接使用浏览器请求服务器上的Web页面,网站中没用动态脚本。
动态网站为网站根据用户发送的请求信息,通过脚本语言生成网页信息。
2.Web应用技术
在开发Web应用程序时,通常需要应用客户端和服务器端两方面的技术,其中,客户端应用的技术主要用于展现信息内容,而服务器端应用的技术主要用于进行业务逻辑的处理和数据库的交互
客户端的技术
HTML:HTML语言是客户端技术的基础,主要用于显示网页信息,有浏览器解释执行,不需要编译。
CSS:一种样式表的技术,或成为层叠样式表,在进行网页制作时才有CSS样式,可以有效地对网页的布局,字体,颜色,背景等效果进行控制。
Flash:交互式矢量动画制作技术,包含动画,音频,视频以及应用程序,而且文件较小。
客户端脚本技术:客户端脚本技术是指嵌入到Web网页中的程序代码,这些程序代码是一种解释性的语言,浏览器可以对客户端脚本进行解释。通过脚本语言可以实现以编程的方式对页面元素进行控制,进而增加页面的灵活性。常见的客户端脚本语言有JavaScript和VBScript。
服务器端的技术
CGI:CGI是最早的WEB服务器端技术,是HTTP过滤程序。CGI在WEB服务器上运行,定义WEB客户请求与应答的方式。只要用户的请求属于定义范围,CGI就会将请求取出并转换,提交给客户端。
ASP:ASP允许HTML和服务器端脚本混合编程,通过JS/VBS等脚本语言编写。
PHP:一种开源的WEB服务器脚本语言,与ASP一样可以在页面中加入脚本代码,PHP中提供了许多已经定义好的函数,具有很强的拓展性。
JSP:以Java为基础开发,沿用了Java强大的API功能,JSP页面中的HTML代码用来显示静态内容部分,而Java代码和JSP标记则生成动态内容。JSP可以通过编写自己的标签库来实现特定的需求,还可以进行预编译,提高程序的运行速度,此外还可以在一次编译之后进行多次运行,适用于任何服务器。
Servlet:Servlet是Java早期的WEB服务器技术,使用Java语言编写,采用类似CGI的原理和编程方式,但是Servlet对请求启动的是线程而非进程。
四.HTTP协议
HTTP协议(Hypertext Transfer Protocol, 超文本传输协议 ),是一个客户端请求和回应的标准协议,这个协议详细规定了浏览器和万维网服务器之间互相通信的规则,用户输入地址和端口号之后就可以从服务器上取得所需要的网页信息。
通信规则规定了客户端发送给服务器的内容格式,也规定了服务器发送给客户端的内容格式。客户端发送给服务器的格式叫“请求协议”,服务器发送给客户端的格式叫“响应协议”。
1.HTTP协议的主要特点
支持客户/服务器模式
简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET和POST,每种方法规定了客户与服务器联系的类型不同。
灵活:HTTP允许传输任意类型的数据对象,正在传输的类型由Content-Type加以标记
HTTP1.1支持持续连接,通过这种连接,就有可能在建立一个TCP连接后,发送请求并得到响应,然后发送更多的请求并得到更多的回应,通过把建立和释放TCP连接的开销分摊到多个请求上,则对于每个请求而言,由于TCP而造成的相对开销被大大降低了。而且还可以发送流水线请求,也就是说在发送请求1之后,在响应到来之前就可以继续发送请求2.
无状态:HTTP协议是无状态协议。在服务器不需要先前信息时的处理速度较快。
2.HTTP的URL
HTTP是一个基于请求与响应模式的、应用层的协议,常基于 TCP 的连接方式,绝大多数的 Web 开发,都是构建在HTTP 协议之上的Web 应用。
HTTP URL 的格式 如下:
http://host[":"post][abs_path]
http 表示要通过 HTTP 协议来定位网络资源; host 表示合法的 Internet 主机域名或 者 IP 地址; port 指定一个端口号,为空则使用缺省端口 80; abs_path指定请求资源的 URI; 如果 URL 中没有给出 abs_path,那么当它作为请求 URI时,必须以“/”的形式给出,通常 这个工作浏览器自动帮我们完成。
3.HTTP请求
HTTP请求由三部分组成:请求行,请求头,请求正文。
[外链图片转存失败(img-24tY3EKS-1562341501330)(C:\Users\咏钦\AppData\Roaming\Typora\typora-user-images\1562340440176.png)]
4.HTTP响应
在接受和解释请求消息后,服务器返回一个HTTP响应信息。HTTP响应也是由三部分组成,分别是:状态行,消息报头,响应正文。
格式:
状态行
响应头 1
响应头 2
…
响应空行
响应体
5.消息头
HTTP消息由客户端都服务器的请求和服务器到客户端的响应组成。请求消息和响应消息都是由开始行(请求行/状态行),消息报头(可选),空行,消息(可选)正文组成。
请求头
请求报头允许客户端想服务器传递请求的附加信息以及客户端自身的信息。
Refere:该请求头指明请求从哪里来。
响应头
响应报头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的消息,核对Request-URI所标识的资源进行下一步的访问的信息。
Location:响应报头域用于重定向接受者到一个新位置。
Refresh:自动跳转,单位为秒,可以在页面通过meta实现,也可以在后台实现。
<meta http-equiv="refresh" content="3";url="http://www.youkuaiyun.com">