`

我的第一个 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

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

分享到:
评论

相关推荐

    第11章 Web Server程序

    本章将深入探讨Web服务器程序的相关知识点,让我们一起走进这个精彩的世界。 首先,我们要理解Web服务器的基本工作原理。当用户在浏览器中输入一个URL并按下回车键时,浏览器会向指定的Web服务器发送一个HTTP请求。...

    计算机网络高级软件编程技术第11章 Web Server程序源代码

    在本资源中,我们主要探讨的是“计算机网络高级软件编程技术第11章 Web Server程序源代码”,这是一份深入理解Web服务器工作原理和技术实现的重要资料。Web服务器是互联网基础设施的关键组成部分,它负责接收HTTP...

    WEB SERVER 的应用

    - ASMX服务:使用Visual Studio创建一个新的ASP.NET Web应用程序项目,然后在项目中添加一个新的ASMX Web服务。在服务中,你可以定义公开的方法,这些方法将在Web服务接口上可用。 - WCF服务:创建一个WCF服务项目...

    web-server

    1. **Web框架**:web.py是一个Python的微型Web框架,它的设计理念是简洁和直接。它提供了处理HTTP请求、路由URL、模板渲染和数据库交互等功能,使得开发Web应用变得简单。 2. **Python 3.5**:这是Python的一个特定...

    baby web server

    1. 快速部署:Baby Web Server允许用户快速启动一个本地Web服务,无需复杂的服务器配置,只需几步操作即可运行个人项目。 2. 支持多种语言:由于其通用性,它支持各种Web应用程序,包括PHP、Python、Java等常见脚本...

    WebServer.rar

    在"WebServer.rar"这个压缩包中,很可能包含了用于创建上述三层结构Web服务的源代码、配置文件和其他相关资源。通过对这些文件的研究和学习,开发者可以深入了解如何在Delphi环境下构建和实现webservice与WebServer...

    Personal Web Server (pws)

    总的来说,Personal Web Server是一个实用的Web服务器软件,尤其对于学习和测试ASP应用程序的开发者来说,它提供了便捷的本地环境。虽然现在可能不是主流选择,但其在历史上的地位和对Web开发教育的贡献不容忽视。...

    java实现web server功能

    本资源以"java实现web server功能"为主题,旨在教你如何使用Java编写一个简单的Web服务器,让我们一起深入探讨这个主题。 首先,理解Web服务器的基本工作原理至关重要。Web服务器接收客户端(通常是Web浏览器)发送...

    数据库开发与WebServer详解(pdf)

    数据库开发是IT行业中至关重要的一个领域,它涉及到数据的存储、管理、检索和更新...总的来说,这个压缩包文件提供了数据库开发和WebServer ASP开发的综合知识,对于想要深入这两个领域的学习者来说是一份宝贵的资源。

    Xfire案例,webserver——Xfire案例

    综上所述,Xfire的webserver案例是一个包含多个技术层面的综合项目,涵盖了网络通信、服务器架构、数据库管理和安全策略等多个IT领域的知识。了解这些知识点有助于我们理解和分析类似的应用程序设计。

    web程序设计PPT课件

    在"第四讲_ASP概述.ppt"中,可能讲解了ASP(Active Server Pages)的基础知识,这是微软开发的一种服务器端脚本环境,用于生成和执行动态网页或Web应用程序。虽然标题中并未直接提及ASP,但了解这一技术可以帮助理解...

    使用PythonFlask开发的一个web可视化的server监控程序

    在本项目中,开发者利用Python的Flask框架创建了一个Web可视化服务器监控程序,该程序能够实时监测HTTP服务器和Redis服务器的状态。以下是对该项目及其组成部分的详细解析: **Flask框架** Flask是一个轻量级的Web...

    Community Server 2008 Web 安装程序

    综上所述,Community Server 2008 Web安装程序是搭建一个全面的社交媒体平台的关键工具,它不仅包含了丰富的社交功能,还提供了稳定的技术基础和可扩展性,为用户和开发者提供了广泛的可能性。安装和管理这个平台...

    goAhead webServer应用开发文档.pdf

    - 第一个参数`eid`代表页面ID,第二个参数`wp`指向Web服务器上下文结构体指针,第三个参数`argc`表示传入的参数个数,第四个参数`argv`表示参数数组。 - 示例:`int aspCreateCurrentUser(int eid, webs_t * wp, int...

    Java Web程序设计教程.pdf

    1. JSP(JavaServer Pages)与Servlet技术的应用方法:JSP是一种用于开发动态网页的技术,而Servlet是一种在服务器端运行的Java小程序,用于处理客户端请求并产生响应。这两项技术是Java Web开发的基础,本书将介绍...

    web service第一次启动慢

    1. DNS解析时间:当应用程序尝试连接到web service时,首先需要将服务的URL转换为IP地址,这个过程可能涉及到域名解析(DNS查询),第一次解析可能会比较耗时。 2. SSL握手:如果web service使用HTTPS协议进行安全...

    WEB程序设计课件第一章

    【网络程序设计】是计算机科学领域的一个重要分支,主要涉及如何...总的来说,"WEB程序设计课件第一章"为学生开启了一扇通向Web应用程序开发的大门,通过理论与实践相结合的方式,引导他们逐步掌握这一领域的核心技能。

    Java Web程序设计任务教程第2章.rar

    在本教程中,我们将深入探讨Java Web程序设计的第二章内容。Java Web技术是构建分布式、动态、交互式网络应用程序的基础,广泛应用于企业级应用开发。这一章将涵盖多个关键概念和技术,帮助初学者理解Java Web开发的...

    .NET平台下Web程序设计实例代码

    在.NET平台上进行Web程序设计,开发者通常会利用微软提供的ASP.NET框架,这是一个强大的工具集,用于构建动态网站、Web应用程序和服务。本实例代码库聚焦于.NET环境下的Web开发实践,旨在帮助初学者和有经验的开发者...

    c#WebServer初体会(关于华氏摄氏转换的例子)

    C# Web服务器是用C#语言构建的一种能够处理HTTP请求并返回响应的程序,它允许开发者创建自己的自定义Web服务,而不依赖于第三方服务器软件。 一、C# Web服务器基础 1. **HttpListener类**:在C#中,我们通常使用`...

Global site tag (gtag.js) - Google Analytics