`
tianhandigeng
  • 浏览: 368957 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

模拟tomcat工作原理

    博客分类:
  • java
 
阅读更多

httpserver原理:服务器端 打开一个socket,一直处在监听tomcat指定的 ip 的指定端口,一旦有访问的,就开启一个线程去处理,代码如下:

-------------------------------server:

package com.kaobian;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import com.session.HttpSession;

public class HttpServer {
    public static void main(String[] args) {
        try {
            ServerSocket server = new ServerSocket(8888);
            while (true) {
                Socket socket = server.accept();
                HttpSession session = new HttpSession(socket);
                new Thread(session).start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
---------------------------------处理线程

package com.session;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;

import com.config.Config;

public class HttpSession implements Runnable {
    private String path = Config.getConfig().getPath();
    private Socket socket ;

    public HttpSession(Socket socket){
        super();
        this.socket = socket;
    }

    public void run() {
         try {
            BufferedReader br = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
            OutputStream out = this.socket.getOutputStream();
            String command = null;
            while((command = br.readLine()) != null){
                System.out.println("浏览器的指令:"+command);
                if(command.length() <3){
                    break;
                }
                String result = command.substring(0,3);
                if(result.equalsIgnoreCase("GET")){
                    int begin = command.indexOf("/")+1;
                    int end   = command.lastIndexOf(" ");
                    String fileName = command.substring(begin,end);
                    doGet(fileName,out);
                }
               
            }
            out.close();
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void doGet(String fileName, OutputStream out) {
        File file = new File(path+fileName);
        if(!file.isDirectory()){
            if(!file.exists()){
                file = new File(path + Config.getConfig().getDefaultPage());   
            }
        }else {
            file = new File(path +  Config.getConfig().getDefaultPage());
        }
        InputStream is  = null;
        try {
            is = new FileInputStream(file);
            byte[] data  =new byte[1024];
            int    len = 0;
            while((len = is.read(data)) != -1){
                out.write(data,0,len);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(is != null){
               try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }finally{
                    is = null;
                }
            }
        }
       
    }

}
---------------------------读取配置文件

package com.config;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class Config {
   
    private String  path ;
    private String  defaultPage;
    private static Config config ;
   
    public static Config getConfig(){
        if(config == null){
            config = new Config();
            config.init();
        }
        return config;
    }
   
    private void init(){
        Properties properties = new Properties();
        try {
            InputStream reader = new FileInputStream(new File("config.properties"));
            properties.load(reader);
            this.path = properties.getProperty("path");
            this.defaultPage = properties.getProperty("defaultIndex");
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
   
    private Config(){
    }
   
    public String getPath() {
        return path;
    }
    public void setPath(String path) {
        this.path = path;
    }
    public String getDefaultPage() {
        return defaultPage;
    }
    public void setDefaultPage(String defaultPage) {
        this.defaultPage = defaultPage;
    }
   
}

------------------配置文件要放到工程的根目录下,要不然自行修改属性文件的位置

path=c://
defaultIndex=div.html

分享到:
评论
1 楼 mytream 2011-09-23  

相关推荐

    模拟tomcat的工作原理

    模拟了tomcat的工作原理,用到了多线程,http协议 等等

    模拟TOMCAT工作的全部过程

    模拟TOMCAT的原理的全过程,新手理解TOCMAT以及SERVLET有很大的帮助

    j2se模拟tomcat

    这个例子是用j2se的Socket和线程的技术来简单的模拟tomcat的执行过程,虽然没有tomact复杂但是原理都是一样的,理解了它再去理解tomcat的执行过程就会比较轻松了

    Tomcat服务器模拟(TCP/IP)

    模拟Tomcat应用服务器的工作原理,有利于理解服务器的工作的模式。简单模拟,不考虑并发性等等因素。

    tomcat源码解析

    本资源是tomcat的源码(包含阅读的注释),和相关原理及生命周期的文档,启动流程等,以及模拟并发对tomcat不同的支持(bio、nio)的压测,还有相关tomcat的启动和部署脚本命令(模拟从svn下载)。

    研究各种Java技术(Springboot+Redis+Dubbo+Rocketmq)

    whatsmars-tomcat 模拟tomcat实现 whatsmars-dbrouter 分库分表实现 whatsmars-worker 多实例任务调度 whatsmars-dubbo Dubbo demo whatsmars-mq rocketmq,activemq rocketmq-console rocketmq管理后台 whatsmars-...

    研究各种Java技术(Springboot+Redis+Dubbo+Rocketmq) 京东技术 www.toutiao.im

    whatsmars-tomcat 模拟tomcat实现 whatsmars-dbrouter 分库分表实现 whatsmars-worker 多实例任务调度 whatsmars-dubbo Dubbo demo whatsmars-mq rocketmq,activemq rocketmq-console rocketmq管理后台 whatsmars-...

    WEB11-XML.rar-源代码

    通过本内容的学习: 1,能够理解 XML 语言的概述 a, 说出 XML 语言的概念 b, 说出 XML 语言的作用 c, 说出 XML 语言的应用...6,能够运用 XML 语言来模拟 Tomcat 服务器 a, 运用 XML 语言写出配置文件文档 b, 运

    JBPM4工作流应用开始指南.rar

    包括jBPM4扩展研发先决条件、深入jPDL和jBPM Service API、升级jBPM3到jBPM4、流程虚拟机原理、jBPM4的设计思想、随需而配jBPM4、异步工作执行器、深入jBPM4电子邮件支持、系统日志、jBPM4与Spring框架集成、jBPM4与...

    SpringBoot源码简易篇

    通过手写模拟SpringBoot源码了解其中的逻辑原理,自动配置,整合Tomcat,启动过程等。

    基于Java数据库连接池的研究与创新

    本文首先介绍了传统连接、tomcat下连接池和hibernate下连接池的基本原理,然后在此基础上提出了一种改进的新型连接池方法,最后基于Java语言对四种连接方法进行了仿真模拟。通过实验测试及连接时间的对比分析,看到...

    标杆徐Linux微课堂: Nginx动静分离/Nginx+uWSGI+Django生产环境部署实践

    1.3) Nginx+Tomcat模拟动静分离效果 ????1.4) 集群环境动静分离效果模拟 2.nginx+python? ????2.1) wsgi、uwsgi协议 ????2.2) uwsgi为什么需要Nginx ????2.3) uwsgi配置场景 ( Django ) ????2.4)部署一个完整的...

    ab压力测试的安装、使用、破2万并发测试

    ab命令会创建多个并发访问线程,模拟多个访问者同时对某一URL地址进行访问。它的测试目标是基于URL的,因此,它既可以用来测试Apache的负载压力,也可以测试Nginx、Lighthttp、Tomcat、IIS等其它Web服务器的压力。 ...

    GeneralWorldwideExecutingMessagingSystem:AWS中的大型分布式消息传递系统

    我正在对Metaverse的工作原理进行有效的解释。 连接在。 有一个非常粗糙的消息传递示例,它是形式的。不久将有世界范围内的端点。 目前只有最低层,没有微服务或存储,只有路由。 有关演示,示例和说明,请参见 。 ...

    百度地图开发java源码-UpdateDemo:应用内更新demo,支持断点续传,缓存清理

    百度地图开发java源码 UpdateDemo 应用内更新demo 对于Android app来说,应用内更新几乎成了一个标配...我们这里模拟一个新版apk相关信息的json文件内容。 {"data":{"content":"更新内容如下:\n 1.xxxxxx;\n 2.xxxxxx

    Web安全深度剖析(张柄帅)

    10.5.1 Tomcat 224 10.5.2 JBoss 226 10.5.3 WebLogic 229 10.6 小结 233 第3篇 实战篇 第11章 实战入侵与防范 236 11.1 开源程序安全剖析 236 11.1.1 0day攻击 236 11.1.2 网站后台安全 238 11.1.3 MD5还安全吗 243...

    apache性能测试工具

    它的测试目标是基于URL的,因此,它既可以用来测试apache的负载压力,也可以测试nginx、lighthttp、tomcat、IIS等其它Web服务器的压力。  ab命令对发出负载的计算机要求很低,它既不会占用很高CPU,也不会占用很多...

    网络安全培训方案.docx

    对学生知识的要求 对Windows、Linu*及SQL语句有一定的了解即可 学生的知识能力提高 本课程重点培训学生的Web渗透测试能力,通过20天的渗透测试培训,学生可具备以下能力 1)、了解Web服务器的工作过程及原理 ...

    Web性能压力测试工具之ApacheBench详解

    它的测试目标是基于URL的,因此,既可以用来测试Apache的负载压力,也可以测试nginx、lighthttp、tomcat、IIS等其它Web服务器的压力。  ab命令对发出负载的计算机要求很低,既不会占用很高CPU,也不会占用很多...

Global site tag (gtag.js) - Google Analytics