手写服务器的步骤-对其进行不断的优化

(一)项目流程图

(二)请求与响应格式

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 -创建HttpRequest类

       用此来封装响应代码块

   4- 创建ServerContext类

     创建xml文件,在其中写入port  pool  webroot protocol参数。如上图所示。

    创建SAXReader对象, 导入dom4j的jar包放到WebContent的lib目录下。

    用SAXReader对象来读取xml中的数据,实现了灵活的方式,方便后续的修改。

    用此来封装服务器相关的参数

   5-创建HttpContext类

      用此来封装http协议的相关参数

  

 此项目,能将Java的部分知识串起来,对Java的知识体系有更好的了解。

 如需优化后的代码,联系qq:1505402756

 作者:张朝才,欢迎转载,收藏。

猜你喜欢

转载自www.cnblogs.com/misscai/p/9575382.html