`
yuanyu5237
  • 浏览: 162790 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

一个简单类似tomcat的webserver程序

    博客分类:
  • JAVA
阅读更多
源码之下,了无秘密。两个类文件,WebServer.java;运行主线程,设置服务器监听端口,Processor.java根据http协议的规定,解析浏览器的请求,返回页面或错误。
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class WebServer {

	/** 默认使用的服务器Socket端口号 */
	public static final int HTTP_PORT = 8080;
	private ServerSocket serverSocket;

	public void startServer(int port) {
		try {
			serverSocket = new ServerSocket(port);
			System.out.println("Web Server startup on  " + port);
			while (true) {
				Socket socket = serverSocket.accept();
				// 通过线程的方式来处理客户的请求
				new Processor(socket).start();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * WebServer类的启动方法,可以通过命令行参数指定当前Web服务器所使用的端口号。
	 */
	public static void main(String[] argv) throws Exception {
		WebServer server = new WebServer();
		if (argv.length == 1) {
			server.startServer(Integer.parseInt(argv[0]));
		} else {
			server.startServer(WebServer.HTTP_PORT);
		}
	}

}

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

/**
 * 处理一个HTTP用户请求的线程类。
 */
public class Processor extends Thread {

	private PrintStream out;
	private InputStream input;
	/** 默认的服务器存放访问内容的目录 */
	public static final String WEB_ROOT = "d:\\java\\workspace\\test\\htdocs";

	public Processor(Socket socket) {
		try {
			input = socket.getInputStream();
			out = new PrintStream(socket.getOutputStream());
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public void run() {
		try {
			String fileName = parse(input);
			readFile(fileName);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 解析客户机发过的所有HTTP请求,如果是符合HTTP协议内容的, 就分析出客户机所要访问文件的名字,并且返回文件名。
	 */
	public String parse(InputStream input) throws IOException {
		BufferedReader in = new BufferedReader(new InputStreamReader(input));
		String inputContent = in.readLine();
		if (inputContent == null || inputContent.length() == 0) {
			sendError(400, "Client invoke error");
			return null;
		}
		// 分析客户请求的HTTP信息,分析出到底想访问哪个文件,
		// 发过来的HTTP请求应该是三部分。

		String request[] = inputContent.split(" ");
		if (request.length != 3) {
			sendError(400, "Client invoke error");
			return null;
		}
		// 第一部分是HTTP状态码
		String stateCode = request[0];
		// 第二部分是请求的文件名
		String fileName = request[1];
		// 第三部分是HTTP版本号
		String httpVersion = request[2];
		System.out.println("State Code: " + stateCode + ", file name: "
				+ fileName + ", HTTP version: " + httpVersion);
		return fileName;
	}

	/**
	 * 处理调用一个文件的请求
	 */
	public void readFile(String fileName) throws IOException {
		File file = new File(Processor.WEB_ROOT + fileName);
		if (!file.exists()) {
			sendError(404, "File Not Found");
			return;
		}
		// 把文件的内容读取到in对象中。
		InputStream in = new FileInputStream(file);
		byte content[] = new byte[(int) file.length()];
		in.read(content);
		out.println("HTTP/1.0 200 sendFile");
		out.println("Content-length: " + content.length);
		out.println();
		out.write(content);
		out.flush();
		out.close();
		in.close();
	}

	/**
	 * 发送错误的信息
	 */
	public void sendError(int errNum, String errMsg) {
		out.println("HTTP/1.0 " + errNum + " " + errMsg);
		out.println("Content-type: text/html");
		out.println();
		out.println("<html>");
		out.println("<head><title>Error " + errNum + "--" + errMsg
				+ "</title></head>");
		out.println("<h1>" + errNum + " " + errMsg + "</h1>");
		out.println("</html>");
		out.println();
		out.flush();
		out.close();
	}
}
分享到:
评论

相关推荐

    简易的类似Tomcat网络容器代码

    【标题】"简易的类似Tomcat网络容器代码"揭示了一个基于Web服务器的开发项目,它模仿了著名的Tomcat服务器的功能,但保持了简洁性。Tomcat是Apache软件基金会的Java Servlet和JavaServer Pages(JSP)应用服务器,是...

    tomcat 部署web项目

    Tomcat 是一个流行的 Java Web 服务器,部署 Web 应用程序到 Tomcat 中有多种方式。下面我们将总结 Tomcat 中部署 Java Web 应用程序的两种方式:静态部署和动态部署。 静态部署 静态部署指的是我们在服务器启动...

    tomcat server.xml配置详解

    Apache Tomcat是一个开源的Servlet容器,主要用来运行Java Servlet和JavaServer Pages(JSP)。`server.xml`是Tomcat的核心配置文件,控制着Tomcat的启动、运行和停止,对性能优化、安全性提升等方面具有至关重要的...

    tomcat7.0安装程序

    Tomcat7.0是Apache软件基金会的Jakarta项目中的一个核心项目,它是一款开源且免费的Web应用服务器,特别适用于部署Java Servlet和JavaServer Pages(JSP)应用程序。这个7.0.2版本是Tomcat7的一个稳定版,提供了一些...

    tomcat启动不了问题处理

    在IT领域,Tomcat服务器是一款非常流行的开源Web服务器,它主要用来部署Java Web应用程序。然而,在使用过程中,用户可能会遇到Tomcat无法启动的问题。本文将详细探讨导致Tomcat启动失败的原因及相应的解决方法,...

    Apache HttpServer 2.4.X 和tomcat连接器

    通过这种方式,Apache HttpServer 2.4.X 和 Tomcat 连接器可以构建出一个强大的Web服务器环境,兼顾静态内容的快速服务和动态应用的高效执行。这种架构在大型网站和企业级应用中尤为常见,因为它既保留了Apache的...

    tomcat与web程序结构与Http协议与HttpUrlConnection[参考].pdf

    可以将Web应用直接拷贝到Tomcat的`webapps`目录下,或者通过编辑`server.xml`配置文件,或者创建一个XML配置文件放在`conf/Catalina/localhost`目录下。 【web.xml中的Servlet配置】 在web.xml中定义的Servlet配置...

    tomcat_server.xml_配置详解.doc

    它由`org.apache.catalina.Server`接口定义,并且仅能包含一个`&lt;Service&gt;`元素。此元素本身不能作为其他元素的子元素。通过以下关键属性进行配置: - **port**:指定用于监听关闭Tomcat请求的端口号。 - **shutdown...

    如何解决TOMCAT的Tomcat's administration web application is no longer installed by default. Download and install the admin package to use it.

    3. **解压admin包**:解压缩下载的文件到一个合适的目录,例如`c:\tom\apache-tomcat-5.5.27`。 4. **复制admin.xml**:将解压后目录`c:\tom\apache-tomcat-5.5.27\conf\Catalina\localhost\admin.xml`中的`admin....

    Tomcat server.xml配置文件详解

    - `&lt;Context&gt;` 元素代表一个 Web 应用程序,通常对应于一个 WAR 文件。例如: - `docBase`: 指定 Web 应用程序的路径或 WAR 文件位置。 - `path`: 定义 Web 应用程序的 URL 前缀。 - `reloadable`: 如果为 true...

    一个电脑配置多个tomcat

    在IT行业中,Tomcat是一个广泛使用的Java Servlet容器,它实现了Java EE的Web应用程序规范。有时候,我们可能需要在一台电脑上部署和运行多个Tomcat实例,以满足不同的项目需求或进行开发、测试和生产环境的隔离。...

    tomcat7 tomcat9 两个资源

    Tomcat是一款开源的Java Servlet容器,主要用于部署和运行Java Web应用程序。这两个版本之间的差异在于功能的增强、性能优化以及对新Java版本的支持。 在描述中,“两个资源”意味着提供的是两个不同版本的Apache ...

    tomcat目录结构解释介绍

    3. `&lt;CATALINA_HOME&gt;/shared`: 类似于`common`目录,`shared/lib`中的JAR文件可以被多个不同的Tomcat实例共享,但不直接暴露给Web应用程序。这有助于保持服务器级的库独立性。 4. `&lt;CATALINA_HOME&gt;/server`: 包含...

    仿写tomcat

    通过仿写Tomcat,你可以深入了解Web服务器的工作流程,提升对Java Web技术的理解,同时这也是一个动手实践的好机会,能够锻炼编程和问题解决能力。在实际操作中,可能会遇到各种挑战,如HTTP协议解析、多线程管理、...

    一台机器上配置三个(或多个)tomcat

    通过这样的配置,我们可以在一个服务器上同时运行多个Tomcat实例,分别服务于不同的Web应用程序,实现资源的高效利用和管理的便捷性。在实际操作中,可能还需要根据具体的应用需求和服务器环境,调整更多配置项,...

    tomcat类包中的一个

    标题中的“tomcat类包中的一个”表明我们讨论的主题与Tomcat有关,这是一款广泛使用的开源Java Servlet容器,用于部署和运行Web应用程序。Tomcat是Apache软件基金会的Jakarta项目的一部分,它实现了Java Servlet和...

    Tomcat简介(PPT)

    Tomcat是由Apache软件基金会下属的Jakarta项目开发的一个开源的轻量级Web应用服务器,主要用于部署和运行基于Java的Web应用程序。它作为Servlet容器之一,能够支持Java Servlet API以及JavaServer Pages(JSP)技术...

    Linux版本tomcat安装包apache-tomcat-9.0.64

    在IT行业中,Tomcat是一个非常重要的应用服务器,它主要用于部署和运行Java Servlet和JavaServer Pages (JSP)。Apache Tomcat是由Apache软件基金会开发的开源软件项目,是Java EE(现在被称为Jakarta EE)规范的一个...

    Linux下Tomcat的启动、关闭、杀死进程

    在Linux环境下部署和管理Java Web应用程序时,Apache Tomcat作为一款广泛使用的应用服务器,其操作过程对于系统管理员和开发人员来说至关重要。本文将详细介绍如何在Linux环境下启动、关闭以及强制终止Tomcat服务。 ...

Global site tag (gtag.js) - Google Analytics