Web应用程序开发原理
C/S架构
客户机/服务器计算模式
客户机和服务器都承担一部分计算
优点:
分担了服务器的一部分压力
缺点:
维护成本高
B/S架构
浏览器/服务器计算模式
浏览器处理简单计算,服务器提供数据支持
优点:
客户端承担一部分计算,维护成本低
缺点:
服务器压力增大,容易崩溃
Web应用程序的组成部分
1.网页
静态网页
客户端动态网页
服务器端动态网页
2.Web服务器
提供数据来源
3.Web浏览器
4.http协议
具备固定格式的字符串
浏览器 --》 http请求协议 --》 服务器 --》 http响应协议 --》 浏览器
1. http请求 是浏览器发数据给服务器 request
2. http响应 服务器回应数据给浏览器 response
服务器只能被动接受浏览器发送的请求,服务器接受到请求之后必定会向浏览器发送响应
http请求
请求行 http方法 请求的URL http版本
请求头
空行
消息体
http请求示例
GET /1010.html HTTP/1.1
Accept: image/gif, image/jpeg, image/pjpeg, application/x-ms-application, application/xaml+xml, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Accept-Language: zh-Hans-CN,zh-Hans;q=0.5
Cache-Control: no-cache
UA-CPU: AMD64
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (Windows NT 6.2; Win64; x64; Trident/7.0; rv:11.0) like Gecko
Host: localhost:8088
Connection: Keep-Alive
Cookie: Idea-d1852ee0=19930357-c834-4171-848b-45b0d6568373
http响应
状态行 http版本 响应码/状态码 响应描述/状态描述
响应头
空行
消息体
例子
一个简单的服务器
/**
* @Title: MyServer.java
* @Package com.lovo.myserver.launch
* @Description: TODO(用一句话描述该文件做什么)
* @author Administrator
* @date 2019年12月6日
* @version V1.0
*/
package com.lovo.myserver.launch;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* <p>Title: MyServer</p>
* <p>Description: </p>
* @author Administrator
* @date 2019年12月6日
*/
public class MyServer {
public static void main(String[] args) {
InputStream inputStream = null;
OutputStream outputStream = null;
try {
//创建ServerSocket 对象,开启8088端口,监听发送过来的请求
ServerSocket serverSocket = new ServerSocket(8088);
System.out.println("启动服务器......");
//让服务器循环监听请求
while (true) {
//接收请求过来的数据
Socket socket = serverSocket.accept();
//获取输入流
inputStream = socket.getInputStream();
//构建一个byte数组,用来装从输入流里面读取出来的数据
byte[] data = new byte[1024];
//从输入流中读取数据放入data数组里面
inputStream.read(data);
//把byte数组中的二进制数据转换成string类型
String httpInfo = new String(data);
System.out.println(httpInfo);
//获取输出流向浏览器响应数据
outputStream = socket.getOutputStream();
//响应普通文本
//outputStream.write("<h1>请求处理完毕,响应数据</h1>".getBytes());
//outputStream.flush();
//响应二进制数据(图片、视频、音频)
FileInputStream imgInput = new FileInputStream("img/main.jpg");
byte[] by = new byte[1024];
int len = 0;
while ((len = imgInput.read(by)) != -1) {
outputStream.write(by, 0, len);
outputStream.flush();
}
if (imgInput != null) {
imgInput.close();
}
if (outputStream != null) {
outputStream.close();
}
if (inputStream != null) {
inputStream.close();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}