手写一个简单的服务器,用于了解http协议

Http协议是基于TCP/IP协议
浏览器 = Socket编程的客户端
http协议的默认端口80 https协议的默认端口443

Http的Get请求数据:

GET /aa/bb/cc.html?a=b&c=d HTTP/1.1 
Host: 127.0.0.1:8080 3 Connection: keep-alive 
Pragma: no-cache 
Content-Type:application/x-www-form-urlencoded 
Cache-Control: no-cache 
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/we bp,image/apng,*/*;q=0.8 
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8 

a=b&c=d

http得到的响应:

HTTP/1.1 200 ok 
Pragma: No-cache 
Cache-Control: no-cache 
Expires: Sun, 07 Dec 1969 03:28:36 GMT 
Last-Modified: Mon, 01 Jul 2019 07:07:06 GMT 
Accept-Ranges: bytes 
Content-Type: text/html 
Content-Length: 3210 
Date: Mon, 29 Jul 2019 02:11:19 GMT 

1234567891011

换行之后才是正文内容

先自己写一个简单的静态服务器和动态服务器

package HttpServer;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.Reader;
import java.io.Writer;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;

public class HttpServer {
	
	private static File root = new File("D:\\workspaces_idea\\yh\\src\\正则表达式");//需要打开的静态网页的地址
	private static Map<String, String> map = new HashMap();//存放后缀名 
	private static String defaultContentType = "application/octet-stream";//当传入的文件没有后缀名时
	
	static {
		map.put("html", "text/html");
		map.put("txt", "text/palin");
		map.put("js", "text/javascript");
		map.put("css", "text/css");
		map.put("jpg", "image/jpeg");
		//...
	}
	
	//获取后缀名
	public static String getContentType(String ext){
		return map.get(ext)==null?defaultContentType:map.get(ext);
	}
	
	public static void main(String[] args) {
		//创建一个socket对象
		try {
			ServerSocket socket = new ServerSocket(8080);
			System.out.println("启动了服务器并且监听了8080端口");
			while(true) {
				Socket client = socket.accept();//阻塞的
				System.out.println("建立了一个TCP连接"+client);
//				new Thread(()->{
//					
//				}).start();
				new Thread(new Runnable() {
					
					@Override
					public void run() {
						try {
							//获取客户端传入的内容
							InputStream in = client.getInputStream();
							Reader reader = new InputStreamReader(in, "UTF-8");
							BufferedReader br = new BufferedReader(reader);
							String line = br.readLine();
							System.out.println(line);//将传入的内容的第一行输出
							String url = line.split(" ")[1];//截取到需要读取到的服务器的文件名
							while(!(line = br.readLine()).equals("")) {
								System.out.println(line);//将内容除了第一行的其他行输出
							}
							System.out.println("请求读取完毕:"+url);
							
							OutputStream out = client.getOutputStream();
							Writer write = new OutputStreamWriter(out,"UTF-8");
							BufferedWriter bw = new BufferedWriter(write);
							PrintWriter pw = new PrintWriter(bw, true);
							
							String hzm = "";//后缀名
							if(url.lastIndexOf(".")>-1) {//有后缀名
								hzm = url.substring(url.indexOf(".")+1).toLowerCase();
							}
							
							File file = new File(root, url);
							if(file.isFile()) {//网页内容是读取服务器的文件(网页内容是静态的)
								pw.println("HTTP/1.1 200 ok");
								pw.println("Content-Type:"+getContentType(hzm)+";charset=UTF-8");
								pw.println();
								pw.flush();
								//将服务器的文件输出到页面
								try(InputStream in1 = new FileInputStream(file)){
									byte[] bs = new byte[1024];
									int len = -1;
									while((len = in1.read(bs))>0) {
										out.write(bs, 0, len);
									}
								}
							}else if(hzm.equals("let")) {//网页内容是动态生成的
								pw.println("HTTP/1.1 200 ok");
								pw.println("Content-Type:"+getContentType("html")+";charset=UTF-8");
								pw.println();
								pw.flush();
								pw.println("

yh

"
); for(int i=0;i<10;i++){ pw.println(String.format("第%s次喜欢你!
"
, i)); } }else { pw.println("HTTP/1.1 404 文件不存在"); pw.println("Content-Type:"+getContentType("html")+";charset=UTF-8"); pw.println(); pw.flush(); pw.println("

404" + url + "文件不存在

"
); } pw.flush(); client.shutdownInput(); client.shutdownOutput(); } catch (Exception e) { e.printStackTrace(); } } }).start(); } } catch (Exception e) { e.printStackTrace(); } } }

在eclipse中开启之后,在浏览器输入本机地址以及要打开的文件名,便可进行访问

你可能感兴趣的:(http,java)