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


    (一)项目流程图

    (二)请求与响应格式

    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

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

  • 相关阅读:
    linux install zh_CN(ubuntu)
    gitweb随记
    gitolite随记
    gitosis随记
    python
    zsh-替换掉黑白的控制台
    Homebrew -- Mac软件管家(套件管理yun……)
    mac中遇到的mysql编码问题
    策略模式 -- 山不转水转
    WPF教程:附加属性
  • 原文地址:https://www.cnblogs.com/misscai/p/9575382.html
Copyright © 2020-2023  润新知