`
cwqcwq
  • 浏览: 75691 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

打造自己的web容器(2)

    博客分类:
  • j2ee
阅读更多
---- 一个简单的web容器

上一篇对socket作了一下简单介绍,这一篇对其进行扩展,建立一个能够读取静态资源的web容器雏形。
由三个类完成:
Request:包装浏览器的请求
Response:包装服务器端的响应
HttpServer:HTTP服务器(接受请求,发送响应)

/**
 * 包装浏览器的请求
 * @author chenwq
 */
public class Request {

	private InputStream input;

	private String uri;

	public Request(InputStream input) {

		this.input = input;
	}

	public void parse() {

		// Read a set of characters from the socket
		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]);
		}
		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;
	}
}


/**
 * 包装服务器端的响应
 * @author chenwq
 */
public class Response {
 
	private static final int BUFFER_SIZE = 1024;

	private Request request;

	private 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 {
			//根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例
			//child 路径名字符串用于表示目录或文件
			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
			System.out.println(e.toString());
		}
		finally {
			if (fis != null)
				fis.close();
		}
	}
}


/**
 * HTTP服务器(接受请求,发送响应)
 * @author chenwq
 */
public class HttpServer {

	/* WEB应用的根目录 */
	public static final String WEB_ROOT = System.getProperty("user.dir") + File.separator + "WebContent";

	// shutdown command
	private static final String SHUTDOWN_COMMAND = "/SHUTDOWN";

	// the shutdown command received
	private boolean shutdown = false;

	public static void main(String[] args) {

		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 socket
				socket.close();
				//check if the previous URI is a shutdown command
				shutdown = request.getUri().equals(SHUTDOWN_COMMAND);
			}
			catch (Exception e) {
				e.printStackTrace();
				continue;
			}
		}
	}
}



测试页面:index.html,该页面位于 ${user.dir}/WebContent/ 下

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<title>Insert title here</title>
	</head>
	<body>
		<h1> Hello! MyWebContainer </h1>
	</body>
</html>


运行HttpServer,启动容器,在浏览器中键入:http://localhost:8080/index.html,得到如下反馈:


  • 大小: 42 KB
分享到:
评论

相关推荐

    QT-HTML.rar_QT_Qt webkit html_Qt5.4 Web容器_qt html

    5. **实例分析**:可能包含一些实际案例,如淘宝客户端如何利用QtWebKit实现特定的Web功能,展示如何在Qt应用中构建一个功能丰富的Web容器。 6. **最佳实践**:分享在开发过程中需要注意的问题,以及如何遵循最佳...

    改造Kuberntetes打造SAE容器云

    【标题】:“改造Kubernetes打造SAE容器云” 在现代云计算环境中,Kubernetes(K8s)已经成为容器编排的主流平台,它提供了一种高效、可扩展的方式来管理和部署容器化应用。SAE(Serverless Application Engine)是...

    java web workspace 02

    JSP页面会被Web容器转换为Servlet执行,生成动态内容。 3. **MVC框架(如Spring MVC)**:MVC(Model-View-Controller)是一种软件设计模式,广泛应用于Web开发中。Spring MVC是Spring框架的一部分,提供了一种组织...

    后端开发入门与实战教程:从0到1打造高效Web应用.zip

    这份"后端开发入门与实战教程:从0到1打造高效Web应用"的资源包,将引领初学者步入这一领域的殿堂,通过系统的学习和实践,使你能够构建出高效且稳定的Web应用。 首先,后端开发的基础知识主要包括编程语言、框架和...

    Web聊天室系统源码

    2. **WebSocket**:为了实现实时通信,Web聊天室通常会利用WebSocket协议。WebSocket提供了全双工通信,允许服务器主动向客户端推送数据,非常适合于聊天室这样需要实时更新的场景。 3. **JavaEE容器**:如Tomcat或...

    基于C++开发的WEB服务器,支持C++、Python、Java等多语言混合开发WEB应用.rar

    cppweb同时也是一个跨平台的微服务开发框架,通过两个核心组件webrouter与webserver提供微服务系统中的接口路由网关、服务注册中心、业务服务容器、定时任务调度中心以及接口...,我们的目标不是实现一个最好cgi容器...

    webcalendar.js控件及其使用说明

    3. **初始化控件**:在JavaScript中创建WebCalendar实例,并指定对应的容器元素。 4. **设置属性**:根据需求调整日历的显示属性,如初始显示的日期、是否显示星期等。 5. **绑定事件**:如果需要,可以为日历的特定...

    阿里云 专有云企业版 V3.8.1 容器服务 产品简介 20200727

    该服务简化集群的搭建和扩容等运维工作,整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳的Kubernetes容器化应用运行环境。 容器服务的优势包括: 1. 使用便捷:通过 Web 界面一键创建 Kubernetes 集群,...

    Go-Cyclone是一个打造容器工作流的云原生持续集成持续发布平台

    2. **容器化构建**:Go-Cyclone支持多种容器引擎,如Docker,它可以将代码封装在容器中,保证了代码在任何环境下的可移植性和一致性。通过容器,开发者可以轻松地在本地开发、测试环境和生产环境之间迁移应用。 3. ...

    小图片,用于web小图片,用于web

    在互联网世界中,小图片,特别是那些优化过的用于Web的小图片,扮演着至关重要的角色。它们不仅能够快速加载,提高用户体验,还能...在实际工作中,应根据具体需求和目标,灵活运用这些技巧,打造高效、美观的Web页面。

    《Java Web应用开发技术实用教程》-王红-电子教案

    《Java Web应用开发技术实用教程》是一本专为学习Java Web开发的初学者和进阶者编写的教材,由王红老师倾力打造。这本书涵盖了Java Web开发的基础知识到高级技术,旨在帮助读者掌握构建动态网页和Web应用程序的技能...

    深入体验Java Web开发内幕

    6. **Web容器与Tomcat**: 了解如何部署和管理Java Web应用在Web容器(如Apache Tomcat)中的运行,包括WAR文件的打包和发布。 7. **Web安全**: 书中可能会讨论关于身份验证、授权、防止SQL注入和XSS攻击等Web安全...

    WEB编程基础学习文档(2)

    在WEB编程领域,基础知识至关重要,尤其对于初学者来说。...通过深入学习和实践,你可以掌握创建动态网页所需的技术,进一步提升自己的Web开发技能。无论是对个人兴趣还是职业发展,这都是一个非常有价值的起点。

    Echarts + Web实现大屏展示效果(一)图片资源

    2. **准备DOM元素**:创建用于显示图表的div容器,并设置合适的宽高。 3. **初始化Echarts实例**:使用`echarts.init()`方法创建Echarts实例,关联到指定的DOM元素。 4. **配置图表**:定义图表的类型、数据、样式等...

    PHPWEB分享式智能网站管理系统 v1.2.0.rar

    2、增加各容器背景图片设置功能 3、增加UCenter会员注册、登录接口 4、增加会员头像上传功能 5、优化插件排版方案,应用排版方案时可选择容器范围 6、增加一键设置隐藏插件边框功能 7、修补程序BUG

    Web经典图表控件 Highcharts控件

    2. 准备数据:根据需求整理数据,一般以JSON格式存储,每个数据项对应图表的一个系列。 3. 创建图表容器:在HTML中设置一个div元素作为图表的容器,为其设置ID以便于JavaScript操作。 4. 初始化图表:在JavaScript...

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

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

    Java_Web整合开发王者归来_10

    标签“java web 王者归来”暗示了该教程可能涵盖了一些高级主题,旨在将读者打造成Java Web开发的高手。 在Java Web开发中,整合开发通常涉及到多个技术和框架的协同工作,以构建高效、可维护的Web应用程序。以下是...

    CAM2WebUI:CAM2 WebUI

    CAM2WebUI是一个专为特拉维斯分行设计的基于Web的用户界面,它与CAM2生产现场和登台现场紧密集成,提供了便捷的在线操作和监控功能。这个项目的核心是利用HTML技术来构建一个直观、高效且响应式的网页应用。下面我们...

    [HeyJava][天一时代][WEB开发]05_Tomcat搭建项目

    2. "天一时代:打造Java特种兵.chm" - CHM文件是一种Windows的帮助文档格式,可能包含更深入的理论知识或相关教程,帮助学习者掌握Java和Web开发的高级技能。 3. "readme.txt" - 通常是提供关于压缩包内容、使用说明...

Global site tag (gtag.js) - Google Analytics