`
gogole_09
  • 浏览: 205090 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

tomcat解析之简单web服务器(图)

阅读更多

    之前有javaeyer推荐了一本书《how tomcat works》,今天晚上看了看,确实不错,第一眼就着迷了。 于是乎就学着书上的例子敲了敲,学会了一个简单web服务器的大概实现,当然,这个简直就无法称之为web服务器,但是也算是走进web服务器的第一步吧。

     这篇文章仅限于学习记录,文笔凌乱之处,还望各位见谅。 OK,下面进入正题;

      开始之前,首先我们要清楚以下几个内容。

 

     首先,一个最简单服务器包括三个部分:
     web服务器----HttpServer
                请求---Request
                响应---Response

 

     这个服务器如何使用:
      1. 请求静态资源 通过 http://localhost:8090/index.html  
                    成功 则返回页面, 否则会返回 File Not Found 的错误信息.
       PS:比如上面的index.html 必须放在一个webroot目录下.
    
      2. 服务器的关闭通过uri来处理
        通过http://lcoalhost:8090/SHUTDOWN 这个Uri来停止服务器.

   
   需要注意的其他几个知识点:
      1. HTTP/1.1 协议的知识。  比如 请求,响应的结构。 发送与接收形式等.
      2. Java中网络的相关只是     ServerSocket 与 Socket 的使用.

 

 OK, 放上代码, 代码只有3个类,都挺简单的, 这个应用只是一个最最简单的雏形:

 

 主类: HttpServer

 

package chapter1.simplewebserver;

import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.InterfaceAddress;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 
 *  下午11:59:29
 * @author gogole_09
 * 简单web服务器
 */
public class HttpServer {
	//定位到webroot目录
	public static final String WEB_ROOT=System.getProperty("user.dir")+File.separator+"webroot";
	//停止命令
	private static final String SHUTDOWN_COMMAND="/SHUTDOWN";
	
	//是否接收到了关闭命令
	private boolean shutdown=false;
	
	/**
	 * 等待命令
	 */
	public void await(){
		ServerSocket serverSocket=null;
		int port=8090;
		try {
			serverSocket=new ServerSocket(port,1,InetAddress.getByName("127.0.0.1"));
		} catch (Exception e) {
			e.printStackTrace();
			System.exit(1);
		}
		
		//监听端口,等待请求。
		while(!shutdown){
			Socket socket=null;
			InputStream input=null;
			OutputStream output=null;
			try {
				socket=serverSocket.accept();
				//输入流 有过jsp编程的哥们都知道这是干嘛的
				input=socket.getInputStream();
				//输出流
				output=socket.getOutputStream();
				
				//构建请求
				Request request=new Request(input);
				//解析请求信息
				request.parse();
				
				//响应类
				Response response=new Response(output);
				response.setRequest(request);
				response.sendStaticResource();
				//处理完毕,关闭 
				socket.close();
				
				//检查提供的URI是否为shutdown命令
				shutdown=request.getUri().equals(SHUTDOWN_COMMAND);
				
			} catch (Exception e) {
				e.printStackTrace();
				continue;
			}
		}
		
	}
	
	public static void main(String[] args) {
		HttpServer server=new HttpServer();
		server.await();
	}
	
}

 

接下来是请求类: 

   Request

 

package chapter1.simplewebserver;

import java.io.IOException;
import java.io.InputStream;

/**
 * 
 *  上午12:09:36
 * @author gogole_09
 *  简单服务器的请求类
 */
public class Request {

	private InputStream input;
	private String uri;
	
	public Request(InputStream in) {
			this.input=in;
	}
	
	/**
	 * 解析Uri操作
	 */
	public void parse() {
		StringBuffer buf=new StringBuffer();
		int i;
		byte[] buffer=new byte[2048];
		try {
			i=input.read(buffer);
		} catch (IOException e) {
				e.printStackTrace();
				i=-1;
		}
		
		for(int j=0;j<i;j++){
			buf.append((char)buffer[j]);
		}
		System.out.println(buf.toString());
		uri=parseUri(buf.toString());
	}

	
	/**
	 * 解析Uri  
	 *  为什么要以' '为做标识 , 这里需要了解HTTP协议的相关结构;
	 *   一个请求行 以 请求方法开头 + 请求URI+ 请求协议版本 + CRLF字符结束
	 *    比如,你请求index.html 用GET方式 ,那么Uri形式为:
	 *    
	 *    GET /index.html HTTP/1.1
	 *    
	 *    
	 * @param requestString
	 * @return
	 */
	private String parseUri(String requestString){
		int index1,index2;
		index1=requestString.indexOf(' ');
		if(index1!=-1){
			index2=requestString.indexOf(' ',index1+1);
			if(index2>index1){
				return requestString.substring(index1+1,index2);
			}
		}
		return null;
	}
	
	public String getUri() {
		
		return uri;
	}

}

 

 

 有了请求了,服务器就得响应啊,试想,我发个请求没反应,你的第一反应是不是想砸电脑呢?

 OK,Response类来了。

 

package chapter1.simplewebserver;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;

/**
 * 
 * 上午12:10:58
 * 
 * @author gogole_09 简易服务器的响应类
 */
public class Response {

	/**
	 * HTTP响应格式:= Status-Line
	 * *((general-header|response-header|entity-header)CRLF) CRLF [message-body]
	 * Status-Line=HTTP-Version SP(空格) Status-Code SP Reason-Phrase CRLF
	 * 
	 */

	private static final int BUFFER_SIZE = 1024;
	Request request;
	private OutputStream output;

	public Response(OutputStream output) {
		this.output = output;
	}

	public void setRequest(Request request) {
		this.request = request;
	}

	/**
	 * 服务器解析并发送静态资源
	 * @throws IOException
	 */
	public void sendStaticResource() throws IOException {
		byte[] bytes = new byte[BUFFER_SIZE];
		FileInputStream fis = null;
		try {
			File file = new File(HttpServer.WEB_ROOT, request.getUri());
			if (file.exists()) {
				fis = new FileInputStream(file);
				int ch = fis.read(bytes, 0, BUFFER_SIZE);
				while (ch != -1) {
					output.write(bytes, 0, ch);
					ch = fis.read(bytes, 0, BUFFER_SIZE);
				}
			} else {
				//文件没找到
				String errorMessage = "HTTP/1.1 404 File Not Found\r\n"
						+ "Content-Type:text/html\r\n"
						+ "Content-Length:23\r\n"+"\r\n<ht>File Not Found</h1>";
				output.write(errorMessage.getBytes());
			}
		} catch (Exception e) {
			System.out.println(e.toString());
			
		}finally{
			if(fis!=null)
				fis.close();
		}
	}

}

 

 

 

 OK,现在这个应用可以运行了,但是你运行起来,没办法用,为什么, 因为还需要有用户请求的静态资源。

  在HttpServer类中,我们hard code了一个webroot目录,约定把所有的静态资源都放到这个目录下面的。

  下面我们就把这个目录建好,并放一点资源进去 ,我是这样放的, 如图:

 

 

 index.html 中 就只有一行代码:

 

 

 

 OK, 下面我们运行一下 HttpServer ,得到页面 如下图:

 

  在控制台,你将会看到程序打印出:

 

 

 

 接着,我们尝试请求一个不存在的资源:   我们会的到一个404的错误页面.

 

OK, 一个简单的web服务器就完成了, 虽然简单,但是我们可以通过这个了解一个大概的流程。

 以及复习一下java net包与HTTP/1.1协议的一些知识。

 

也希望这个篇文章对都有需要的人有帮助。

 

 

 PS: 最近有很多朋友都问这本书哪里有买,我本人并非看的纸质的,而是电子版的, 需要下载的可以去新浪共享频道找找, 我的是从哪里下来的, 中文书名就叫 <tomcat工作原理>

  • 大小: 6.5 KB
  • 大小: 6.3 KB
  • 大小: 22.1 KB
  • 大小: 18 KB
  • 大小: 64.2 KB
分享到:
评论
14 楼 nbnxyuyun 2010-06-12  
public static final String WEB_ROOT=System.getProperty("user.dir")+File.separator+"webroot";中user.dir如何设,我试了无法侦测到8090端口.
13 楼 sw1982 2010-03-26  
刚好受这个帖子推荐看到shutdownhook这个玩意,可是这个东东只能处理本身正在运行的进程退出。
现在的场景是我用sh脚本nohup启动一个java进程后台运行,然后怎么友好关闭这个线程呢?  最简单的就是向一个端口发stop请求。

gogole_09 写道
sw1982 写道
比较精华的地方是启动、关闭操作。。
占用一个port监听关闭命令,呵呵。 这里可以对java项目的友好关闭做一下处理

这个port监听不止是单独处理关闭,所有的请求都通过端口的,只是为了简单,根据URI来确定是否关闭。 实际在tomcat内部,还用到了ShutDownHook这个东西来处理 tomcat的关闭。 有兴趣的可以看看how tomcat works的ShutDownHook这个章节。 呵呵, 欢迎交流。

12 楼 gogole_09 2010-03-25  
sw1982 写道
比较精华的地方是启动、关闭操作。。
占用一个port监听关闭命令,呵呵。 这里可以对java项目的友好关闭做一下处理

这个port监听不止是单独处理关闭,所有的请求都通过端口的,只是为了简单,根据URI来确定是否关闭。 实际在tomcat内部,还用到了ShutDownHook这个东西来处理 tomcat的关闭。 有兴趣的可以看看how tomcat works的ShutDownHook这个章节。 呵呵, 欢迎交流。
11 楼 gogole_09 2010-03-25  
mercyblitz 写道
Tomcat 不也是处理Socket吗?

tomcat内部也是处理socket的, 不知有什么不对吗?
10 楼 sw1982 2010-03-22  
比较精华的地方是启动、关闭操作。。
占用一个port监听关闭命令,呵呵。 这里可以对java项目的友好关闭做一下处理
9 楼 mercyblitz 2010-03-22  
Tomcat 不也是处理Socket吗?
8 楼 fantasybei 2010-02-18  
也没你说得那么好,一般般吧,有些东西说得太罗嗦.
7 楼 hellojinjie 2010-02-16  
为何不用 NIO 来实现呢,,
6 楼 smartman_jc 2010-02-10  
不错!学习了,受益匪浅
5 楼 gogole_09 2010-02-08  
wanggp 写道
应该是how tomcat works

嘿嘿,是的。 书名写错了,马上修正。
4 楼 elgs 2010-02-07  
how tomcat works在中国买不到,这么好的书。
3 楼 wanggp 2010-02-07  
应该是how tomcat works
2 楼 gogole_09 2010-02-06  
曾经de迷茫 写道
请问楼主浏览器上装的什么东东,看请求资源的那个?

是Http Watch. 查看请求url,传递的参数,以及服务器返回数据的好东西。
1 楼 曾经de迷茫 2010-02-06  
请问楼主浏览器上装的什么东东,看请求资源的那个?

相关推荐

    web服务器tomcat7.0

    描述中提到的"tomcat 使用jsp开发web的web服务器,其使用性很好",这表明Tomcat是开发基于JSP技术的Web应用程序的理想选择,因为它是轻量级的,安装和配置相对简单,且在性能和稳定性上表现出色。Tomcat的易用性使得...

    apach-tomcat-6.0免费web服务器

    Apache Tomcat 6.0是一款深受开发者欢迎的开源Web服务器和Servlet容器,它主要用于部署Java Web应用程序。这个版本是免费提供的,对初学者极其友好,是学习和开发Java Web项目的重要工具。 首先,Apache Tomcat是...

    Tomcat配置web服务器环境

    本文将详细解析如何配置Tomcat作为Web服务器环境,以便开发者能够顺利地部署和运行自己的Web应用。 首先,我们需要了解Tomcat的基本结构。Tomcat包含了几个关键的目录,如`bin`(存放可执行文件)、`conf`(存储...

    简易静态Web服务器

    【简易静态Web服务器】是一个适合Java初学者的项目,它实现了最基本的Web服务器功能,只用于加载HTML文件。这个Web服务器的核心在于三个Java类:HttpServer、Request和Response,每个类都扮演着Web服务中关键角色。 ...

    Tomcat WEB服务器实战

    ### Tomcat WEB服务器实战知识点概览 #### 一、Tomcat简介与特点 - **Tomcat**: Apache软件基金会下属的Jakarta项目开发的一款开源Servlet容器,支持Servlet和JavaServer Pages (JSP) 技术标准。 - **核心功能**: ...

    Tomcat架构解析文档.zip

    Tomcat作为一款开源的、基于Java的Web应用服务器,是许多初学者和开发者入门Java Web应用的首选。它轻量级、高效且易于管理,广泛应用于小型到中型企业级应用。在面试中,对Tomcat架构的理解往往能够反映出应聘者...

    tomcat6.0 适用与java web 程序的开发服务器

    《深入理解Tomcat 6.0:打造高效Java Web服务器》 Tomcat 6.0是一款广泛应用的开源Java Web服务器,由Apache软件基金会维护,它实现了Java Servlet和JavaServer Pages(JSP)规范,为Java Web应用程序提供了一个轻...

    web服务器 tomcat

    "Web服务器 Tomcat" 指的是Apache Tomcat,它是一个开源的、免费的应用服务器,主要用于运行Java Servlet和JavaServer Pages(JSP)技术。Tomcat是Java社区中的一个关键组件,因为它提供了对Java EE Web应用程序的...

    Tomcat解析与性能优化.pdf

    ### Tomcat解析与性能优化知识点概述 #### 一、Tomcat基本构成与文件结构 **1. 文件构成** - **1.1 server/shared/common目录** - **Java类库存放位置**:`/server/lib`、`/shared/lib` 和 `/common/lib` 三个...

    Tomcat与Java.Web开发技术详解

    《Tomcat与Java.Web开发技术详解》是一本深入解析Tomcat服务器和Java Web开发的教程。本书旨在帮助读者全面理解如何使用Tomcat作为Java Web应用的运行环境,并掌握相关的开发和部署技巧。以下是对该主题的详细阐述:...

    Tomcat与Java Web开发技术详解源代码.rar

    它以其小巧、高效、易用的特点,成为了许多初学者和小型企业首选的Java Web服务器。Tomcat的配置和管理相对简单,适合快速搭建和测试Java Web应用。 在Java Web开发中,Servlet是Java EE平台的核心组件之一,它是...

    Tomcat8.0 适用小型服务器

    1. **Tomcat介绍**:Tomcat是Apache软件基金会的Jakarta项目中的一个核心项目,它是一个开源的、免费的Web服务器和应用服务器,专门用来运行Java Servlet和JSP。Tomcat实现了Servlet和JSP的相关规范,如Servlet 3.1...

    简单JAVA WEB服务器

    通过深入理解并实践这个“简单JAVA WEB服务器”项目,学习者可以掌握基础的Web服务器开发技术,为今后学习更复杂的Java Web框架如Spring MVC、Tomcat等打下坚实基础。此外,此项目也提供了一个动手实践的机会,有助...

    java模拟tomcat的web服务器源码

    Java模拟Tomcat Web服务器源码解析 在Java世界中,Tomcat是一款广泛应用的开源Web服务器和Servlet容器。它遵循Java Servlet和JavaServer Pages(JSP)规范,为开发者提供了轻量级、高效的运行环境。本篇文章将深入...

    Tomcat与Java.Web开发技术详解+源代码

    《Tomcat与Java.Web开发技术详解》是一本深入解析Tomcat服务器和Java Web开发的教程,结合源代码和丰富的学习资源,旨在帮助开发者全面理解并掌握相关技术。书中的标签"Tomcat与Web"明确了主要讨论的内容是围绕...

    Web应用服务器tomcat视频.zip

    【描述】:本教程主要涵盖了与Web应用服务器Tomcat相关的知识,通过一系列视频课程,深入浅出地讲解了如何搭建LNMP架构,JDK的安装与配置,以及Tomcat的环境部署、目录结构解析和管理端配置等内容。以下是各视频课程...

    Apache+Tomcat服务器集群配置详细步骤

    ### Apache+Tomcat服务器集群配置详细步骤 #### 一、引言 在现代Web开发中,随着业务规模的不断扩大和用户需求的日益增长,单一服务器往往难以满足高性能、高可靠性的要求。为了应对这一挑战,通常采用Apache+...

    精通Tomcat-Java Web应用开发

    《精通Tomcat - Java Web应用开发》是一本深入解析如何使用Tomcat服务器进行Java Web应用程序开发的专业书籍。这本书全面覆盖了Tomcat的基础知识、高级特性以及实战技巧,旨在帮助开发者熟练掌握在Tomcat上构建、...

    tomcat和java web源码

    Tomcat的配置文件主要包括`server.xml`、`web.xml`等,它们定义了服务器的行为和Web应用的部署规则。 孙老师的Java Web教程源码很可能是包含了一个完整的Web应用示例,可能涵盖以下内容: 1. **Servlet基础**:...

    Tomcat与Java Web开发技术详解

    《Tomcat与Java Web开发技术详解》是由知名Java专家孙卫琴编著的一本深入解析Tomcat和Java Web开发的专业书籍。这本书旨在帮助开发者全面理解如何利用Tomcat服务器进行高效、稳定的应用程序部署和管理,同时涵盖了...

Global site tag (gtag.js) - Google Analytics