1、首先完成一个server类,用来接收客户端的请求;代码都在一个while(true)循环中,模拟tomcat一直在启动,其中绑定一个端口,用来监听一个端口,然后创建一个输入流,获取请求的输入流,然后将输入流中的uri和参数通过request获取出来,然后通过response答应出来。

 package com.dongnao.mytomcat;

 import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date; public class Server {
private static int count=0;
public static void main(String[] args) {
ServerSocket ss=null;
Socket socket=null;
SimpleDateFormat format=new SimpleDateFormat("yyy-MM-dd HH:mm:ss");
String time=format.format(new Date()); try {
ss=new ServerSocket(9994);
System.out.println("已经连接服务器"); while(true){
socket =ss.accept();
count++;
System.out.println("第几次连接:"+count); InputStream is=socket.getInputStream();
Request request=new Request(is); OutputStream os=socket.getOutputStream(); Response response= new Response(os); //业务逻辑 ,获取静态资源;
String uri=request.getUri();
System.out.println(uri);
//判定这个是不是静态资源
if(isStaticSourse(uri)){
response.writeFile(uri.substring(1));
}else if(uri.endsWith(".action")){
if(uri.endsWith("/login.action")){
//取账户和密码
LoginServlet servlet=new LoginServlet();
try {
servlet.service(request, response);
} catch (Exception e) {
e.printStackTrace();
}
}
}
//出while循环后要关闭
os.close();
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
} }
public static boolean isStaticSourse(String uri){
String[] suffixString={"html","css","js","jpg","jepg","png"};
boolean isStatic =false;
for(String suffix:suffixString){
if(uri.endsWith("."+suffix)){
isStatic=true;
break;
}
} return isStatic;
} }

2、创建一个request类,用来模拟request对象,用来获取对应的uri和参数,其中请求方式有get和post,get的也有参数,这里没忽略了,主要涉及的是post的请求方式,然后截取post中的请求参数。

 package com.dongnao.mytomcat;

 import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
/**
* 解析请求类,解析请求资源的地址
* @author CYA
*
*/
public class Request {
private String uri;
private String pString;
//halderMap
private HashMap<String,String> paramMap=new HashMap<String,String>();
//取得客户参数名称;
public String getParamName(String key){ return paramMap.get(key);
}
public Request(InputStream is) throws IOException{
byte[] buff=new byte[1024];
int len=is.read(buff);
if(len>0){
String msg=new String(buff,0,len);
int start=msg.indexOf("GET")+4;
if(msg.indexOf("POST")!=-1){
start=msg.indexOf("POST")+5;
}
int end=msg.indexOf("HTTP/1.1")-1;
//获取对应的uri路径
uri=msg.substring(start, end);
if(msg.startsWith("POST")){
int paramString=msg.lastIndexOf("\n");
pString=msg.substring(paramString+1);
String [] parms=pString.split("&");
for(String parm:parms){
String[] temp= parm.split("=");
paramMap.put(temp[0], temp[1]);
}
}
System.out.println("-----"+uri+"-----"); }else{
System.out.println("bad request");
}
}
public String getUri() {
return uri;
}
public void setUri(String uri) {
this.uri = uri;
} }

3、创建一个response类,用来模拟response对象,其中主要是通过读取对应的静态资源,然后

 package com.dongnao.mytomcat;

 import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream; /**
*��Ӧ�ķ�װ�ࣺд��Ϣ��ͻ���
* @author CYA
*
*/
public class Response {
private OutputStream os=null;
public Response(OutputStream os) {
this.os=os;
}
public void writeContent(String content) throws IOException{
content="HTTP/1.0 200 OK\nContent-type:text/html; charset=utf-8\n\n"+content;
os.write(content.getBytes());
os.flush();
os.close();
}
/**
* ��̬��Ӧ�������
* @param path
* @throws IOException
*/
public void writeHtmlFile(String path) throws IOException{
String htmlContentString=FileUtils.getFileContent(path);
writeContent(htmlContentString);
}
public void writeFile(String path){
//读取文件
try {
FileInputStream fis=new FileInputStream(path);
byte[] buff=new byte[512];
int len=0;
while((len=fis.read(buff))!=-1){
os.write(buff, 0, len);
}
fis.close();
os.flush();
os.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} }
}

4、创建一个loginservlet用来模拟dispacherservlet,封装request和response对象

 package com.dongnao.mytomcat;

 public class LoginServlet {
public void service(Request request,Response response) throws Exception{
String username=request.getParamName("username");
String password=request.getParamName("pwd");
if(username!=null&&username.equals("admin")&&password!=null&&password.equals("123")){
response.writeHtmlFile("welcome.html");
}else{
response.writeHtmlFile("error.html");
}
}
}

5其中封装了一个工具类,用来封装读取文件的内容。

 package com.dongnao.mytomcat;

 import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException; /**
*读取文件的工具类
* @author CYA
*
*/
public class FileUtils {
/**
* 工具类
*/
public static String getFileContent(String path){
StringBuffer sb=new StringBuffer();
FileReader fr=null;
BufferedReader br=null;
try {
fr=new FileReader(path);
br=new BufferedReader(fr);
String line=null;
while((line=br.readLine())!=null){
sb.append(line);
}
} catch (Exception e) {
e.printStackTrace();
} finally{
try {
br.close();
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return sb.toString();
}
}

tomcat底层原理实现的更多相关文章

  1. 【Spring boot】整合tomcat底层原理

    本文结论 源码基于spring boot2.6.6 项目的pom.xml中存在spring-boot-starter-web的时候,在项目启动时候就会自动启动一个Tomcat. 自动配置类Servle ...

  2. Servlet底层原理、Servlet实现方式、Servlet生命周期

    Servlet简介 Servlet定义 Servlet是一个Java应用程序,运行在服务器端,用来处理客户端请求并作出响应的程序. Servlet的特点 (1)Servlet对像,由Servlet容器 ...

  3. 【Servlet】(1)Servlet简介、Servlet底层原理、Servlet实现方式、Servlet生命周期

    一.Servlet简介 1.Servlet定义: Servlet(Server Applet)是Java Servlet的简称,是为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交 ...

  4. Tomcat 架构原理解析到架构设计借鉴

    Tomcat 发展这么多年,已经比较成熟稳定.在如今『追新求快』的时代,Tomcat 作为 Java Web 开发必备的工具似乎变成了『熟悉的陌生人』,难道说如今就没有必要深入学习它了么?学习它我们又 ...

  5. Java8线程池ThreadPoolExecutor底层原理及其源码解析

    小侃一下 日常开发中, 或许不会直接new线程或线程池, 但这些线程相关的基础或思想是非常重要的, 参考林迪效应; 就算没有直接用到, 可能间接也用到了类似的思想或原理, 例如tomcat, jett ...

  6. Neo4j图数据库简介和底层原理

    现实中很多数据都是用图来表达的,比如社交网络中人与人的关系.地图数据.或是基因信息等等.RDBMS并不适合表达这类数据,而且由于海量数据的存在,让其显得捉襟见肘.NoSQL数据库的兴起,很好地解决了海 ...

  7. 【T-SQL进阶】02.理解SQL查询的底层原理

    本系列[T-SQL]主要是针对T-SQL的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础]02.联接查询 [T-SQL基础]03.子查询 [T-SQL基础]04.表表达式 ...

  8. spring框架的IOC的底层原理

    1.IOC概念:spring容器创建对象并管理 2.IOC的底层原理的具体实现: 1)所使用的技术: (1). dom4j解析xml配置文件 (2).工厂设计模式(解耦合) (3).反射 第一步:配置 ...

  9. 深入研究Sphinx的底层原理和高级使用

    深入研究Sphinx的底层原理和高级使用

随机推荐

  1. Google之Chromium浏览器源码学习——base公共通用库(四)

    本文将介绍debug调试相关的内容,包括调试器.性能分析.堆跟踪.跟踪事件等: alias.h:Alias函数,提供防止载微软的编译器优化某参数变量的操作,内部通过#pragma optimize(& ...

  2. 各种解析漏洞获取Webshell

    各种解析漏洞拿shell  一.IIS 6.0解析漏洞 IIS 6.0解析利用方法有两种1.目录解析/xx.asp/xx.jpg2.文件解析wooyun.asp;.jpg第一种,在网站下建立文件夹的名 ...

  3. TComboBox; 指定某一行,不给下拉,只读ReadOnly 伪装 实现

    //cbb1: TComboBox; 指定某一行,不给下拉,自读伪装 实现: cbb1.Style :=csSimple; //设定style 不可以下拉 cbb1.ItemIndex := ; // ...

  4. TMS 例子63 分组,子node

    procedure TForm1.InitGrid; begin advstringgrid1.Grouping.MergeHeader := true; //这个什么作用没有是 advstringg ...

  5. 【转】如何提高意志力&如何坚持每天学习

    第一篇如何提高意志力 有一种品质可以使一个人在碌碌无为的平庸之辈中脱颖而出,这个品质不是天资,不是教育,也不是智商,而是自律.有了自律,一切皆有可能,无,则连最简单的目标都显得遥不可及.–西奥多·罗斯 ...

  6. java实例化对象的方式

    一.Java中创建(实例化)对象的五种方式  1.用new语句直接创建对象,这是最常见的创建对象的方法. 2.通过工厂方法返回对象,如:String str = String.valueOf(23); ...

  7. Leetcode Longest Common Prefix

    Write a function to find the longest common prefix string amongst an array of strings. class Solutio ...

  8. Dijkstra算法初步 - 迷宫问题

    你来到一个迷宫前.该迷宫由若干个房间组成,每个房间都有一个得分,第一次进入这个房间,你就可以得到这个分数.还有若干双向道路连结这些房间,你沿着这些道路从一个房间走到另外一个房间需要一些时间.游戏规定了 ...

  9. 【水】基于ege的2048

    不要问我ege怎么装 http://tieba.baidu.com/p/2227018541 好,现在我们装好了ege 开始写2048吧 没有算法,单纯模拟,不用讲解——这才叫[水]的含义 界面极度简 ...

  10. 【新手学Python】一、基础篇

    由于以前处理数据用Matlab和C,最近要处理大量文本文件,用C写实在是太繁琐,鉴于Python的强大文本处理能力,以及其在Deep Learning上有着很大优势,本人打算从即日起学习Python, ...