手动实现tomcat服务器的流程:

  

分析具体的实现步骤:

1,浏览器和后端服务如何实现通信,首先传输的数据要遵循http协议,通过tcp也就是我们常说的套接字编程来实现,具体的底层数据传输肯定就是我们的输入输出流来实现了。

2,我们再来看后台服务器的实现逻辑,首先我们要定义两个对象,一个request,一个response分别用来存放请求的参数以及返回的参数。

3,创建一个ServerSocket,等待浏览器的连接和数据传输,当通过输入流读取到数据,放入到request对象。

4,浏览器的请求类型一般分为get和post两种,所以我们需要一个mpper映射类来根据浏览器的访问路径来分发具体处理的类或者方法。

5,处理之后获取处理的结果,并放到response对象,通过输出流返回给浏览器。

下面是具体的代码实现:

1,reques类

package com.liuyi;

import java.io.InputStream;

public class MyRequest {

    //请求方法  GET/POST
private String requestMethod;
//请求地址
private String requestUrl; public MyRequest(InputStream inputStream) throws Exception{
//缓冲区域
byte[] buffer = new byte[1024];
//读取数据的长度
int len = 0;
//定义请求的变量
String str = null; if((len = inputStream.read(buffer))>0){
str = new String(buffer,0,len);
}
// GET / HTTP/1.1
String data = str.split("\n")[0];
String[] params = data.split(" ");
this.requestMethod = params[0];
this.requestUrl = params[1];
} public String getRequestMethod() {
return requestMethod;
} public void setRequestMethod(String requestMethod) {
this.requestMethod = requestMethod;
} public String getRequestUrl() {
return requestUrl;
} public void setRequestUrl(String requestUrl) {
this.requestUrl = requestUrl;
}
}

2,response类

package com.liuyi;

import java.io.OutputStream;

public class MyResponse {

    private OutputStream outputStream;

    public MyResponse(OutputStream outputStream) {
this.outputStream = outputStream;
} public void write(String str) throws Exception{
StringBuilder builder = new StringBuilder();
builder.append("HTTP/1.1 200 OK\n")
.append("Content-Type:text/html\n")
.append("\r\n")
.append("<html>")
.append("<body>")
.append("<h1>"+str+"</h1>")
.append("</body>")
.append("</html>");
this.outputStream.write(builder.toString().getBytes());
this.outputStream.flush();
this.outputStream.close();
}
}

3,Mapping类,定义请求路径和请求处理类的关系

package com.liuyi;

import java.util.HashMap;

public class MyMapping {

    public static HashMap<String,String> mapping = new HashMap<String,String>();

    static {
     //这里请改成自己servlet实现类的完全限定名
mapping.put("/mytomcat","com.liuyi.MyServlet");
} public HashMap<String,String> getMapping(){
return mapping;
}
}

4,定义HpptServlet抽象类,实现get和post的分发(根据不同的请求方式调用不同的方法进行处理)

package com.mashibing;

public abstract class MyHttpServlet {

    //定义常量
public static final String METHOD_GET = "GET";
public static final String METHOD_POST = "POST"; public abstract void doGet(MyRequest request,MyResponse response) throws Exception;
public abstract void doPost(MyRequest request,MyResponse response) throws Exception; /**
* 根据请求方式来判断调用哪种处理方法
* @param request
* @param response
*/
public void service(MyRequest request,MyResponse response) throws Exception{
if(METHOD_GET.equals(request.getRequestMethod())){
doGet(request,response);
}else if(METHOD_POST.equals(request.getRequestMethod())){
doPost(request,response);
}
}
}

5,定义自己的servlet

package com.liuyi;

public class MyServlet extends MyHttpServlet{
@Override
public void doGet(MyRequest request, MyResponse response) throws Exception {
response.write("mytomcat get");
} @Override
public void doPost(MyRequest request, MyResponse response) throws Exception {
response.write("post tomcat");
}
}

6,定义服务端的接受程序,接受socket请求

package com.liuyi;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket; public class MyServer {
/**
* 定义服务端的接受程序,接受socket请求
* @param port
*/
public static void startServer(int port) throws Exception{ //定义服务端套接字
ServerSocket serverSocket = new ServerSocket(port);
//定义客户端套接字
Socket socket = null; while (true){
socket = serverSocket.accept(); //获取输入流和输出流
InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStream(); //定义请求对象
MyRequest request = new MyRequest(inputStream);
//定义响应对象
MyResponse response = new MyResponse(outputStream); String clazz = new MyMapping().getMapping().get(request.getRequestUrl());
if(clazz!=null){
Class<MyServlet> myServletClass = (Class<MyServlet>)Class.forName(clazz);
//根据myServletClass创建对象
MyServlet myServlet = myServletClass.newInstance();
myServlet.service(request,response);
} }
} //运行启动
public static void main(String[] args) {
try {
startServer(10086);
} catch (Exception e) {
e.printStackTrace();
}
}
}

总结:

  本案例只是实现了简单的tomcat和servlet,仅仅只是为了让我们学习servlet和tomcat没有那么多的疑惑,学起来会更容易。实际工作中当然也不会这样去写,

但是如果你认值把这个代码敲一遍,并理解为什么这样写,那么对你学习java web肯定会有很大的帮助。

手动实现简单的tomcat服务器的更多相关文章

  1. 计算机网络(13)-----java nio手动实现简单的http服务器

    java nio手动实现简单的http服务器  需求分析 最近在学习HTTP协议,还是希望动手去做一做,所以就自己实现了一个http服务器,主要功能是将http请求封装httpRequest,通过解析 ...

  2. java基础76 web服务器之Tomcat服务器

    (注:本文是以“压缩版Tomcat”为例,展开描述的) 一.Tomcat服务器的介绍 1.服务器 1.1.服务器的种类 从物理上讲:服务器就是一台pc机器.至少8核/8G以上.内存至少用T来计算.宽带 ...

  3. Tomcat服务器的下载与安装,修改端口号

    安装及简单配置Tomcat服务器: 1.登录www.apache.org 网站,之后点击Projects , 点击Project List,找到Tomcat. 2.点击Tomcat之后,之后进入Tom ...

  4. JSP学习笔记(三):简单的Tomcat Web服务器

    注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...

  5. Tomcat剖析(二):一个简单的Servlet服务器

    Tomcat剖析(二):一个简单的Servlet服务器 1. Tomcat剖析(一):一个简单的Web服务器 2. Tomcat剖析(二):一个简单的Servlet服务器 3. Tomcat剖析(三) ...

  6. Tomcat剖析(一):一个简单的Web服务器

    Tomcat剖析(一):一个简单的Web服务器 1. Tomcat剖析(一):一个简单的Web服务器 2. Tomcat剖析(二):一个简单的Servlet服务器 3. Tomcat剖析(三):连接器 ...

  7. Tomcat学习笔记(一)一个简单的Web服务器

    内容为<深入剖析Tomcat>第一章重点,以及自己的总结,如有描述不清的,可查看原书. 一.HTTP协议: 1.定义:用于服务器与客户端的通讯的协议,允许web服务器和浏览器通过互联网进行 ...

  8. Tomcat服务器简单测试jsp文件和html文件

    在tomcat里面的webapps文件夹下面新建一个test文件, 写一个test.html的文件,一个test.jsp的文件,两个文件的内容全是:2+2=<%=2+2%> 重新启动Tom ...

  9. java web(一):tomcat服务器的安装和简单介绍,与eclipse关联

    一:下载tomcat安装包和安装 这个百度一下就可以了. 安装完以后进入tomcat的安装路径查看 如图所示:有几个目录简单介绍下 bin目录:   存放运行tomcat服务器的相关命令. conf目 ...

随机推荐

  1. 一文看懂YOLO v3

    论文地址:https://pjreddie.com/media/files/papers/YOLOv3.pdf论文:YOLOv3: An Incremental Improvement YOLO系列的 ...

  2. 【Jenkins】远程调用jenkins进行构建方式!

    前提:jenkins支持远程调用(具体设置自行百度)1.在我的个人中心--configure--API TOKEN--如果没有,则添加一个token,并生成,再复制并记录下来2.在你的job上面加上你 ...

  3. 写给前端同学的C++入门教程(一):概述和环境搭建

    说明:本人是前端er,因为最近对 UE4(一个游戏开发引擎)产生了兴趣,而这个引擎源开发游戏时需要用到 C++ ,所以就开始入坑 C++ 了.现将自己学习 C++ 的笔记整理并分享出来,以便一些想入门 ...

  4. 安装虚拟机V15.5及LinuxCentOS6简易步骤

    1.下载虚拟机和Linux系统: (1)虚拟机下载地址(失效请自行百度):http://www.downza.cn/soft/74728.html (2)Linux系统下载地址(失效请自行百度):ht ...

  5. 用python和GDAL 读取GRIB数据

    from osgeo import gdal import numpy as np path = './data/201912/anl_surf125.2019120100' dataset = gd ...

  6. Dubbo 常用模型

    先了解如下几个概念 Invoker Invoker 是实体域,它是 Dubbo 的核心模型,其它模型都向它靠扰,或转换成它,它代表一个可执行体,可向它发起 invoke 调用,它有可能是一个本地的实现 ...

  7. update不能直接使用select的返回结果

    update不能直接使用select的返回结果,这是会报错的,这是SQL的语法规定的,若想在update中与select结合使用,sql需要这样写: 1.其中field1,field2为表中的字段名 ...

  8. docker 启动容器restart 策略

    docker 运行容器时使用--restart 参数可以指定一个restart策略,来指定容器应该如何重启,或不应该重启,当容器启用restart策略时,将会载docker ps 显示up 或者res ...

  9. Flutter - 自定义Dialog弹窗

    ------------恢复内容开始------------ Flutter - 自定义Dialog弹窗 应用场景:app系统版本升级弹窗,系统退出登录弹窗,首页广告弹窗,消息中心弹窗,删除文件弹窗等 ...

  10. Promise 配合 axios 使用

    Promise是一个构造函数,自己身上有all.reject.resolve这几个眼熟的方法,原型上有then.catch等同样很眼熟的方法 很细致的Promise使用详解 自己脑补 vue 工程化的 ...