手写Http服务器

什么是Http协议?

Http协议: 对浏览器客户端 和 服务器端 之间数据传输的格式规范

Http是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,而且HTTP-NG(Next Generation of HTTP)的建议已经提出。
HTTP协议的主要特点可概括如下:
1.支持客户/服务器模式。
2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

Http是使用Socket中的TCP协议实现,基于请求(客户端)、响应(服务器端)

实例:http://127.0.0.1:8080/项目路径

Http协议分为请求报文和响应报文

请求模式 Get、Post、Delete…

默认Http请求参数(请求报文)

GET / HTTP/1.1

Host: 127.0.0.1:8080

Connection: keep-alive

Cache-Control: max-age=0

Upgrade-Insecure-Requests: 1

User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2783.4 Safari/537.36

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8

Accept-Encoding: gzip, deflate, sdch

Accept-Language: zh-CN,zh;q=0.8

Cookie: Hm_lvt_b43c1c82b09cda6b125e6981fbde442c=1487946887,1487950668,1488114252; CNZZDATA1259976290=1895288300-1478441025-%7C1488116464

详解:

手写Http服务器_第1张图片Http响应报文

HTTP响应报文与HTTP请求报文是对应的,也是分为三个部分。

1、响应行

2、响应头

3、响应体

给个实例:

HTTP/1.1 200 OK  //响应行
Date: Sat, 31 Dec 2005 23:59:59 GMT
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 122
this titlewww.baidu.com

手写Http服务器_第2张图片

手写Http服务器_第3张图片

浏览器如何调试

使用谷歌浏览器、按F12.

封装Response、Request、多线程改造

封装Response响应体

public class Response {
	//private OutputStream bw;
	private BufferedWriter bw;
	// 响应内容
	private StringBuffer responseContent;
	// 响应头
	private StringBuffer responseHead;
	private long len;
	private static final String SPACE = " ";
	private static final String CRLF = "\r\n";

	public Response(OutputStream out) {
		bw = new BufferedWriter(new OutputStreamWriter(out));
		responseContent = new StringBuffer();
		responseHead = new StringBuffer();
	}

	public void createHeadInfo(int code) {
		responseHead.append("HTTP/1.1");
		responseHead.append(SPACE);
		responseHead.append(code + "").append(SPACE);
		switch (code) {
		case 200:
			responseHead.append("ok");
		case 404:
			responseHead.append("not found");
		case 500:
			responseHead.append("server error");
			break;
		default:
			break;
		}
		responseHead.append(CRLF);
		responseHead.append("Date:").append(new Date()).append(CRLF);
		responseHead.append("Content-Type: text/html;charset=UTF-8").append(CRLF);
		responseHead.append("Content-Length:").append(len).append(CRLF);
		responseHead.append(CRLF);

	}

	public Response print(String str) {
		responseContent.append(str);
		len += str.getBytes().length;
		return this;
	}
	/**
	 * 发送数据
	 * @throws IOException 
	 */
	public void connect(int code) throws IOException{
		createHeadInfo(code);
		bw.append(responseHead.toString());
		bw.append(responseContent.toString());
		bw.flush();
		bw.close();
	}

}

封装Request对象

 

你可能感兴趣的:(JavaWeb)