手写一个最迷你的Web服务器

  相信大家对Tomcat服务器应该都很熟悉了,我们几乎每天都会用它,它的安装目录结构大致如下:

  

手写一个最迷你的Web服务器_第1张图片

 

  今天我们就仿照Tomcat服务器来手写一个最简单最迷你版的web服务器,仅供学习交流。

  1. 在你windows系统盘的F盘下,创建一个文件夹webroot,用来存放前端代码。

  2. 创建一个简单的Java项目,项目结构如下图:

  

手写一个最迷你的Web服务器_第2张图片

 

  3. 代码介绍:

  (1)ServerThread.java 核心代码,主要用于web文件的读取与解析等。代码如下:

  package server;

  import java.io.*;

  import java.net.Socket;

  import java.util.Date;

  import java.util.HashMap;

  import java.util.Map;

  /**

  * @ClassName: ServerThread

  * @Description:

  * @Author: liuhefei

  * @Date: 2019/6/23

  * @blog: https://www.imooc.com/u/1323320/articles

  **/

  public class ServerThread implements Runnable {

  private static MapString, String contentMap = new HashMap();

  //可以参照Tomcat的web.xml配置文件

  static {

  contentMap.put(html, text/html);

  contentMap.put(htm, text/html);

  contentMap.put(jpg, image/jpeg);

  contentMap.put(jpeg, image/jpeg);

  contentMap.put(gif, image/gif);

  contentMap.put(js, application/javascript);

  contentMap.put(css, text/css);

  contentMap.put(json, application/json);

  contentMap.put(mp3, audio/mpeg);

  contentMap.put(mp4, video/mp4);

  }

  private Socket client;

  private InputStream in;

  private OutputStream out;

  private PrintWriter pw;

  private BufferedReader br;

  private static final String webroot = F:\\webroot\\; //此处目录,你可以自行修改

  public ServerThread(Socket client){

  this.client = client;

  init();

  }

  private void init(){

  //获取输入输出流

  try {

  in = client.getInputStream();

  out = client.getOutputStream();

  } catch (IOException e) {

  e.printStackTrace();

  }

  }

  @Override

  public void run() {

  try {

  gorun();

  } catch (Exception e) {

  e.printStackTrace();

  }

  }

  private void gorun() throws Exception {

  //读取请求内容

  BufferedReader reader = new BufferedReader(new InputStreamReader(in));

  String line = reader.readLine().split( )[1].replace(/, \\); //请求的资源

  if(line.equals(\\)){

  line += index.html;

  }

  System.out.println(line);

  String strType = line.substring(line.lastIndexOf(.)+1, line.length()); //获取文件的后缀名

  System.out.println(strType = + strType);

  //给用户响应

  PrintWriter pw = new PrintWriter(out);

  InputStream input = new FileInputStream(webroot + line);

  //BufferedReader buffer = new BufferedReader(new InputStreamReader(input));

  pw.println(HTTP/1.1 200 ok);

  pw.println(Content-Type: + contentMap.get(strType) +;charset=utf-8);

  pw.println(Content-Length: + input.available());

  pw.println(Server: hello);

  pw.println(Date: + new Date());

  pw.println();

  pw.flush();

  byte[] bytes = new byte[1024];

  int len = 0;

  while ((len = input.read(bytes)) != -1){

  out.write(bytes, 0, len);

  }

  pw.flush();

  input.close();

  pw.close();

  reader.close();

  out.close();

  client.close();

  }

  }

  (2)HttpServer.java (普通版)服务端

  

手写一个最迷你的Web服务器_第3张图片

 

  (2)HttpServer1.java (线程池版)服务端

  

手写一个最迷你的Web服务器_第4张图片

 

  4. 将一个具有index.html的静态页面文件拷入到我们创建的webroot目录下。相关的静态web资源代码可以到源码之家下载或是自己编写。

  5. 启动web服务,启动HttpServer.java 或HttpServer1.java都可以,服务启动之后将会监听9005端口。

  6. 我们到浏览器上访问我们的服务,访问地址:http://localhost:9005/index.html,

  即可看到效果,我的效果如下:

  

手写一个最迷你的Web服务器_第5张图片

 

  控制台打印如下:

  

手写一个最迷你的Web服务器_第6张图片

 

  到这里,一个简单的Web服务器就完成了。

你可能感兴趣的:(个人技术分享)