`
yuanyu5237
  • 浏览: 159673 次
  • 性别: 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();
	}
}
分享到:
评论

相关推荐

    apache-tomcat-10.0.20-win64

    Tomcat是应用(java)服务器,它只是一个servlet容器,是Apache的扩展。 Apache和Tomcat都可以做为独立的web服务器来运行,但是Apache不能解释java程序(jsp,servlet)。 两者都是一种容器,只不过发布的东西不同...

    Java类文件加密专家

    假设您的Java Web Server为Tomcat,以Windows平台为例,Tomcat的存放目录为C:\Tomcat 5.5 ,JLoader.dll存放在c:\windows目录中,在Tomcat的bin目录中新建一个文件setenv.bat,setenv.bat中的内容:set JAVA_OPTS= ...

    JavaClass二进制文件加密专家

    举例 : 假设您的Java Web Server为Tomcat,以Windows平台为例,Tomcat的存放目录为C:\Tomcat 5.5 ,brainysoft.dll存 放在c:\windows目录中,在Tomcat的bin目录中新建一个文件setenv.bat,setenv.bat中...

    JAVA上百实例源码以及开源项目源代码

    Tcp服务端与客户端的JAVA实例源代码 2个目标文件 摘要:Java源码,文件操作,TCP,服务器 Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多...

    JAVA上百实例源码以及开源项目

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    Lemansys LEWS:Lemansys LEWS Java Web应用程序的替代框架-开源

    Lemansys LEWS(轻量级可扩展Web脚本)是基于非常简单且“基本类似”的脚本语言(Lemansys Server Pages“ .lem”)的替代框架,该脚本语言也面向“非纯粹” JSP开发人员(PHP,ASP等)。 ; 您可以使用Eclipse WTP...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    Tomcat是一个免费的开源的Serlvet容器,在Tomcat中,应用程序的部署很简单,你只需将你的WAR放到Tomcat的webapp目录下,Tomcat会自动检测到这个文件,并将其解压。你在浏览器中访问这个应用的Jsp时,通常第一次会很...

    Java面试宝典2010版

    1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。 2、编写一个程序,将d:\java目录下的所有.java文件复制到d:\...

    cliente-oauth:OUATH2 客户端使用智利的唯一密钥进行身份验证

    OAUTH2客户端WEB应用组成使用 Java Server Faces 构建的 Web 应用程序的 MAVEN 项目,该应用程序能够集成到的身份验证机制部署此应用程序的步骤是: 准备好一个 JBoss AS 7.1.1 或一些实现 JEE 的 AS,对于 Tomcat,...

    JAVA班主任管理系统毕业论文(源代码+word论文).zip

    因此,越来越多的学校对班主任这一角色也越来越重视,一些院校专门对班主任进行一系列培训,并且由原来的一个系甚至一个院配备一名辅导员增加至每个班级一名班主任。 与上述管理需求不符的是:针对班主任工作的配套...

    java面试题

    当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步。在很多情况下采用异步往往更有效率。 数据库三大范式? 答:1:确保每列都是不可分割的原子值 2...

    最新Java面试宝典pdf版

    1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。 61 2、编写一个程序,将d:\java目录下的所有.java文件复制到d...

    Java面试笔试资料大全

    1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。 61 2、编写一个程序,将d:\java目录下的所有.java文件复制到d...

    JAVA面试宝典2010

    1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。 61 2、编写一个程序,将d:\java目录下的所有.java文件复制到d...

    Java面试宝典-经典

    1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。 61 2、编写一个程序,将d:\java目录下的所有.java文件复制到d...

    java面试题大全(2012版)

    1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。 61 2、编写一个程序,将d:\java目录下的所有.java文件复制到d...

    Java面试宝典2012版

    1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。 61 2、编写一个程序,将d:\java目录下的所有.java文件复制到...

    java面试宝典2012

    1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。 67 2、编写一个程序,将d:\java目录下的所有.java文件复制到d...

Global site tag (gtag.js) - Google Analytics