`

我的第一个 web server 程序

    博客分类:
  • java
 
阅读更多
参考书《How Tomcat Works》这本书非常好,我觉得翻译也不错。

根据第二章的例子,我写了我的第一个 web server 程序

HttpServer.java

package ex01.xiejiaohui;

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

public class HttpServer {
	
	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 static void main(String[] ars) {
		HttpServer server = new HttpServer();
		server.await();
	}
	
	public void await() {
		
		ServerSocket serverSocket = null;
		int port = 8080;
		try {
			serverSocket = new ServerSocket(port, 1, InetAddress.getByName("127.0.0.1"));
			
		} catch (IOException e) {
			e.printStackTrace();
			System.exit(1);
		}
		
		// Loop waiting for a request
		while (!shutdown) {
			Socket socket = null;
			InputStream input = null;
			OutputStream output = null;
			try {
				socket = serverSocket.accept();
				input = socket.getInputStream();
				output = socket.getOutputStream();
				
				// create Request object and parse
				Request request = new Request(input);
				request.parse();
				
				// create Response object
				Response response = new Response(output);
				response.setRequest(request);
				response.sendStaticResource();
				
				// Close the socketk
				socket.close();
				
				// check if the previous URI is a shutdown command
				shutdown = request.getUri().equals(SHUTDOWN_COMMAND);
			} catch (Exception e) {
				e.printStackTrace();
				continue;
			}
		}
		
	}

}



Request.java

package ex01.xiejiaohui;

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

public class Request {

	private InputStream input;
	
	private String uri;
	
	public Request(InputStream input) {
		this.input = input;
	}
	
	public void parse() {
		
		StringBuffer request = new StringBuffer(2048);
		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++) {
			request.append((char)buffer[j]);
		}
		System.out.print(request.toString());
		uri = parseUri(request.toString());
	}
	
	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;
	}
	
	
	
}



Response.java

package ex01.xiejiaohui;

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

public class Response {
	
	private static final int BUFFER_SIZE = 1024;
	Request request;
	OutputStream output;
	
	public Response(OutputStream output) {
		this.output = output;
	}
	
	public void setRequest(Request request) {
		this.request = request;
	}
	
	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 {
				// file not found
				String errorMessage = "HTTP/1.1 404 File Not Found\r\n" +
				"Content-Type: text/html\r\n" +
				"Content-Length:23\r\n" +
				"\r\n" +
				"<h1>File Not Found<h1>";
				output.write(errorMessage.getBytes());
			}
		} catch (Exception e) {
			// thrown if cannot instantiate a File object
			e.printStackTrace();
			System.out.println(e.toString());
		} finally {
			if (fis != null) {
				fis.close();
			}
		}
	}
	
	

}



然后在 webroot 目录下新建 文件 index.html

运行 HttpServer.java

然后在浏览器中访问你的第一个 web server 并且是纯 Java 版的

http://127.0.0.1:8080/index.html  注意具体的文件名称,虽然只有一个html文件

eclipse 中控制台输出如下:

GET /index.html HTTP/1.1
Host: 127.0.0.1:8080
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.152 Safari/537.22
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8
Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3

千万不要写错了,如果写错了,浏览器会提示:无法显示此页

分享到:
评论

相关推荐

    simple web server

    模仿how tomcat works第一章写的程序

    web service第一次启动慢

    【web service的释放】winform 程序第一次访问Webservice 慢的问题.pdf 文档为网上收集,版权归原作者所有,O(∩_∩)O谢谢。

    2020年计算机二级《Web程序设计》练习题及答案.doc

    (超链接) 20、 Web全称是 ,(World Wide Web) ----------------------- 2020年计算机二级《Web程序设计》练习题及答案全文共4页,当前为第1页。 2020年计算机二级《Web程序设计》练习题及答案全文共4页,当前为

    Ajiu AspWebServer V2.0 服务器 (版本号2.0.2.4)

    如果您厌倦了IIS的庸肿,如果您不愿意第N次重装IIS,如果您对替代品这个词很感兴趣,请您尝试一下Ajiu AspWebServer吧... 使用说明: 『1』将您的网页置与本软件同一目录下,双击运行! 『2』双击右下角任务栏...

    J2EE应用与BEA.WebLogic.Server第2版.pdf

    第一章 概述 第二章 表示逻辑 第三章 高级servlet 技术 第四章 使用 WebLogic Server JSP 第五章 WebLogic Server JDBC 和 JTA 第六章 远程方法调用和分布式命名 第七章 使用 Java 消息服务进行企业消息传递 第八章 ...

    Visual C#+SQL Server数据库开发与实例光盘第四章节

    书第1,2章分别介绍了使用Visual C#和SQL Server开发数据库应用程序的基本知识,第3章~第10章,通过开发8个完整实用的数据库应用程序,系统全面地介绍了用Visual C#和SQL Server来进行数据库应用程序开发的各种技术...

    Visual C#+SQL Server数据库开发与实例光盘第九章节

    本书第1,2章分别介绍了使用Visual C#和SQL Server开发数据库应用程序的基本知识,第3章~第10章,通过开发8个完整实用的数据库应用程序,系统全面地介绍了用Visual C#和SQL Server来进行数据库应用程序开发的各种...

    JSP程序设计实例教程(第2版)-电子课件第1章-Java-Web编程基础.pptx

    目录 1.1 JSP简介 1.2 JSP工作原理 1.3 JSP程序体系结构 1.4 HTML和CSS简介 1.5 XML基础简介 1.6 搭建JSP的运行环境 1.7 第一个JSP应用 JSP程序设计实例教程(第2版)-电子课件第1章-Java-Web编程基础全文共73页,...

    Visual C#+SQL Server数据库开发与实例光盘第十一章节(完)

    本书第1,2章分别介绍了使用Visual C#和SQL Server开发数据库应用程序的基本知识,第3章~第10章,通过开发8个完整实用的数据库应用程序,系统全面地介绍了用Visual C#和SQL Server来进行数据库应用程序开发的各种...

    Visual C#+SQL Server数据库开发与实例光盘

    书第1,2章分别介绍了使用Visual C#和SQL Server开发数据库应用程序的基本知识,第3章~第10章,通过开发8个完整实用的数据库应用程序,系统全面地介绍了用Visual C#和SQL Server来进行数据库应用程序开发的各种技术...

    Visual C#+SQL Server数据库开发与实例光盘第十章节

    本书第1,2章分别介绍了使用Visual C#和SQL Server开发数据库应用程序的基本知识,第3章~第10章,通过开发8个完整实用的数据库应用程序,系统全面地介绍了用Visual C#和SQL Server来进行数据库应用程序开发的各种...

    Visual C#+SQL Server数据库开发与实例光盘第三章节

    书第1,2章分别介绍了使用Visual C#和SQL Server开发数据库应用程序的基本知识,第3章~第10章,通过开发8个完整实用的数据库应用程序,系统全面地介绍了用Visual C#和SQL Server来进行数据库应用程序开发的各种技术...

    Visual C#+SQL Server数据库开发与实例光盘第五章节

    书第1,2章分别介绍了使用Visual C#和SQL Server开发数据库应用程序的基本知识,第3章~第10章,通过开发8个完整实用的数据库应用程序,系统全面地介绍了用Visual C#和SQL Server来进行数据库应用程序开发的各种技术...

    计算机二级《Web程序设计》模拟及答案.docx

    (3)Server(服务器)对象:它提供对驻留在服务器上的资源的访问 计算机二级《Web程序设计》模拟及答案全文共2页,当前为第1页。 (4)Session(会话期)对象:它用于存储和管理与一个特定的用户会话有关的信息 (5)...

    SQL Server 2005 Web 应用开发.rar

    本光盘是《SQL Server 2005 Web 应用开发》一书的配书光盘,内容包括了书中第11、12、13、14章的例题源代码。 本光盘根目录下有5个文件夹,其内容和含义说明如下: (1) 4个文件夹名对应于《SQL Server 2005 Web...

    web_server_uid:从Ruby中的Apache的mod_uid nginx的ngx_http_userid_module解析并表示UID令牌

    但是,这种方法有一个很大的警告:访问者向您的网站发出的第一个请求将不会在您的Web服务器日志中使用此唯一ID进行标记,因为访问者在访问它们时将不会在其浏览器中显示Cookie提出了要求。 此初始请求至关重要,...

    Visual C#+SQL Server数据库开发与实例光盘第七章节

    本书第1,2章分别介绍了使用Visual C#和SQL Server开发数据库应用程序的基本知识,第3章~第10章,通过开发8个完整实用的数据库应用程序,系统全面地介绍了用Visual C#和SQL Server来进行数据库应用程序开发的各种...

    Java-Web程序设计实战-第8章-JDBC详解.pptx

    Java-Web程序设计实战-第8章-JDBC详解全文共86页,当前为第1页。 2 Java-Web程序设计实战-第8章-JDBC详解全文共86页,当前为第2页。 3 Java-Web程序设计实战-第8章-JDBC详解全文共86页,当前为第3页。 JDBC是一个...

    ASP+SQL Server典型网站建设案例(Web在线考试系统)

    第1章 在线考试系统 1.1 应用背景 1.2 系统设计 1.2.1 系统构架 1.2.2 系统功能模块设计 1.2.3 系统主要工作流程 1.2.4 数据库的分析与设计 1.3 程序主要页面设计 1.4 IIS配置与SQL Server数据库连接 1.4.1 IIS配置 ...

    Visual C# SQL Server数据库开发与实例 光盘(iso)

    本书第1,2章分别介绍了使用Visual C#和SQL Server开发数据库应用程序的基本知识,第3章~第10章,通过开发8个完整实用的数据库应用程序,系统全面地介绍了用Visual C#和SQL Server来进行数据库应用程序开发的各种...

Global site tag (gtag.js) - Google Analytics