(一)项目流程图
(二)请求与响应格式
Http请求(写服务器的时候,请求的格式必须按此格式,否则无法正确请求)
Http响应(写服务器的时候,响应的格式必须按此格式,否则无法正确响应)
(三)项目结构
(1)项目需求:模拟tomcat服务器,实现接收客户端的请求,经过服务器处理业务,最终把数据响应给客户端
(四)一个简单服务器模型(最基本的结构)
1 package cn.tedu.core; 2 3 4 5 import java.io.IOException; 6 7 import java.io.OutputStream; 8 9 import java.net.ServerSocket; 10 11 import java.net.Socket; 12 13 public class WebServer { 14 15 16 17 //1,声明ServerSocket对象 18 19 private ServerSocket server; 20 21 22 23 //2,在构造函数中完成ServerSocket对象的初始化 24 25 public WebServer(){ 26 27 try { 28 29 //绑定端口号 30 31 server = new ServerSocket(8080); 32 33 System.out.println("start server..."); 34 35 } catch (IOException e) { 36 37 e.printStackTrace(); 38 39 } 40 41 } 42 //3,提供start方法,接收客户端的请求并响应 43 public void start(){ 44 45 try { 46 47 while(true){ 48 49 //持续接收客户端请求 50 51 Socket socket = server.accept(); 52 53 //改造输出数据的格式 54 55 PrintStream ps = 56 57 new PrintStream( 58 59 socket.getOutputStream()); 60 61 //拼接状态行 62 63 ps.println("HTTP/1.1 200 OK"); 64 65 //拼接响应头,响应内容:网页类型 66 67 ps.println("Content-Type:text/html"); 68 69 //拼接响应头,响应内容的长度 70 71 String data = "hello server~"; 72 73 ps.println("Content-Length:"+data.length()); 74 75 76 77 //拼接空白行 78 79 ps.println(); 80 81 82 83 //拼接响应实体内容(真正要显示的内容) 84 85 ps.write(data.getBytes()); 86 87 ps.flush(); 88 89 socket.close(); 90 91 } 92 93 } catch (IOException e) { 94 95 e.printStackTrace(); 96 97 } 98 } 99 //4,提供main方法,启动服务器 100 101 public static void main(String[] args) { 102 103 WebServer server = new WebServer(); 104 105 //接收客户端请求,并响应 106 107 server.start(); 108 109 }
(五)优化,降低耦合度
1 -创建ClientHandler类,线程类,抽取start中的相应代码
创建线程的两种方式 1. 继承Thread 2.实现Runable接口
2 -创建HttpRequest类
用此来封装请求代码块
3 -创建HttpResponse类
用此来封装响应代码块
4- 创建ServerContext类
创建xml文件,在其中写入port pool webroot protocol参数。如上图所示。
创建SAXReader对象, 导入dom4j的jar包放到WebContent的lib目录下。
用SAXReader对象来读取xml中的数据,实现了灵活的方式,方便后续的修改。
用此来封装服务器相关的参数
5-创建HttpContext类
用此来封装http协议的相关参数
此项目,能将Java的部分知识串起来,对Java的知识体系有更好的了解。
如需优化后的代码,联系qq:1505402756
作者:张朝才,欢迎转载,收藏。