一个简单的web服务器例子
一个简单的web容器小例子,功能十分简单,只能访问静态资源,对于新手来说还是有一定的意义。主要分三个类
1、server类:主要功能开启socketServer,阻塞server,接收socket访问,解析request,创建request,作出响应
public class TestServer1 { private boolean shutdown = false; // web目录webroot
public static final String WEB_ROOT = System.getProperty("user.dir")
+ File.separator + "WebRoot"; public static final String SHUTDOWN_COMMAND = "/SHUTDOWN"; public static void main(String[] args) {
TestServer1 server = new TestServer1();
server.await();
} public void await() { // 第一步、创建出serverSocket监听本机8080端口
ServerSocket server = null;
int port = 8080;
try {
server = new ServerSocket(port, 1, InetAddress.getByName("127.0.0.1"));
} catch (Exception e) {
e.printStackTrace();
} // 第二步、轮询阻塞住socketServer
while(!shutdown) {
Socket socket = null;
InputStream input = null;
OutputStream output = null; try {
socket = server.accept();
input = socket.getInputStream();
output = socket.getOutputStream(); // 第三步、创建出request,解析request请求
Request req = new Request(input);
req.parseRequest(); // 第四步、创建response
Response response = new Response(output);
response.setRequest(req); // 第五步、发送简单静态资源,关闭socket结束本次会话
response.sendStaticRes();
socket.close(); // 关闭指令
shutdown = req.getUri().equals(SHUTDOWN_COMMAND);
} catch (IOException e) {
e.printStackTrace();
}
} } }
当然了上面的是最简单的实现,也不能实现多线程,实际上的web容器肯定会创建一个线程池来接收请求
2、request 主要的工作解析input流,封装成request
class Request { private InputStream input; private String uri; public Request(InputStream input) {
this.input = input;
} /**
* 解析request请求内容
* GET /index.html HTTP/1.1
* Accept: text/html, application/xhtml+xml, *//*
* Accept-Language: zh-CN
* User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; MALCJS; rv:11.0) like Gecko
* Accept-Encoding: gzip, deflate
* Host: localhost:8080
* DNT: 1
* Connection: Keep-Alive
* Cookie: 这个地方应该如果有cookie,如果有session还有jsessionId的
*/
public void parseRequest() {
// 为什么只获取2048个字符,这是因为request请求内容的长度,出于安全或者其他方面的考虑,在浏览器端和服务器端都会做这么一个限制。
StringBuffer buffer = new StringBuffer(2048);
byte[] bytes = new byte[2048];
int i;
try {
i = input.read(bytes);
} catch (IOException e) {
e.printStackTrace();
i=-1;
} for(int k=0; k<i; k++) {
buffer.append((char)bytes[k]);
}
System.out.println(buffer.toString());
uri = parseUri(buffer.toString());
} /**
* GET /index.html HTTP/1.1 uri的位置
* @param reqStr
* @return
*/
private String parseUri(String reqStr) {
int index1, index2;
index1 = reqStr.indexOf(' ');
if (index1 != -1) {
index2 = reqStr.indexOf(' ', index1 + 1);
if (index2 > index1)
return reqStr.substring(index1 + 1, index2);
}
return null;
} public String getUri() {
return uri;
} }
解析成的http请求的具体内容,作为web开发人员应该要熟悉每个字段的意义,这个请求是浏览器本身按照http协议封装的一个请求,能够手写出这个请求当然更好。
3、response 通过request的uri找到对应的资源对请求作出响应,实际的情况肯定是有静态和动态资源例如servlet\filter等等,但是这里只是做了简单的静态的处理了
class Response { private OutputStream output; private Request request; public Response(OutputStream output) {
this.output = output;
} public void setRequest(Request req) {
this.request = req;
} /**
* 简单处理静态资源
* @throws IOException
*/
public void sendStaticRes() throws IOException { FileInputStream fis = null;
try {
File staticFile = new File(TestServer1.WEB_ROOT, request.getUri());
if(staticFile.exists()) {
fis = new FileInputStream(staticFile);
int i = 0;
byte[] buf = new byte[1024];
// 流的对拷
i = fis.read(buf, 0, 1024);
while(i!=-1) {
output.write(buf, 0, i);
i = fis.read(buf, 0, 1024);
}
} else {
// file not found 404
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) {
e.printStackTrace();
} finally{
if(fis!=null)
fis.close();
fis = null;
}
}
}
同样响应内容你也应该要熟悉哪些组成部分
HTTP/1.1 200 OK //响应行
Date: Sat, 31 Dec 2005 23:59:59 GMT
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 122 <html>
<head>
<title>Test</title>
</head>
<body>
This my page
</body>
</html>
至此一个简单的web容器就写好了,能够访问webRoot目录下的静态资源。
可以通过浏览器访问,也可以通过telnet端进行访问。在cmd命令行下telnet localhost 8080,就会连接上socketServer,然后就会等待输入,自然我们输入对应的请求报文,回车响应内容就出现了。
以上原创文章出自老罗家的树博客地址:http://www.cnblogs.com/TimBing/
一个简单的web服务器例子的更多相关文章
- 自己动手模拟开发一个简单的Web服务器
开篇:每当我们将开发好的ASP.NET网站部署到IIS服务器中,在浏览器正常浏览页面时,可曾想过Web服务器是怎么工作的,其原理是什么?“纸上得来终觉浅,绝知此事要躬行”,于是我们自己模拟一个简单的W ...
- 一个简单的web服务器
写在前面 新的一年了,新的开始,打算重新看一遍asp.net本质论这本书,再重新认识一下,查漏补缺,认认真真的过一遍. 一个简单的web服务器 首先需要引入命名空间: System.Net,关于网络编 ...
- [置顶] 在Ubuntu下实现一个简单的Web服务器
要求: 实现一个简单的Web服务器,当服务器启动时要读取配置文件的路径.如果浏览器请求的文件是可执行的则称为CGI程序,服务器并不是将这个文件发给浏览器,而是在服务器端执行这个程序,将它的标准输出发给 ...
- Tomcat剖析(一):一个简单的Web服务器
Tomcat剖析(一):一个简单的Web服务器 1. Tomcat剖析(一):一个简单的Web服务器 2. Tomcat剖析(二):一个简单的Servlet服务器 3. Tomcat剖析(三):连接器 ...
- 自己模拟的一个简单的web服务器
首先我为大家推荐一本书:How Tomcat Works.这本书讲的很详细的,虽然实际开发中我们并不会自己去写一个tomcat,但是对于了解Tomcat是如何工作的还是很有必要的. Servlet容器 ...
- 2.1 一个简单的Web工程例子
一个简单的Web工程例子 开发环境: Eclipse: Neon Release (4.6.0) JDK:1.8.0_92 Tomcat:8.5.9 Maven:3.3.9 1. 在Eclipse中创 ...
- 利用 nodeJS 搭建一个简单的Web服务器(转)
下面的代码演示如何利用 nodeJS 搭建一个简单的Web服务器: 1. 文件 WebServer.js: //-------------------------------------------- ...
- 《深度解析Tomcat》 第一章 一个简单的Web服务器
本章介绍Java Web服务器是如何运行的.从中可以知道Tomcat是如何工作的. 基于Java的Web服务器会使用java.net.Socket类和java.net.ServerSocket类这两个 ...
- 一个简单的Web服务器-支持Servlet请求
上接 一个简单的Web服务器-支持静态资源请求,这个服务器可以处理静态资源的请求,那么如何处理Servlet请求的呢? 判断是否是Servlet请求 首先Web服务器需要判断当前请求是否是Servle ...
随机推荐
- 杨佩昌:中国官员去德国考察看什么两眼发光 z
令中国人诧异的德国物价 只要是花费大量人工的行业,就很贵 □杨佩昌 德国是欧洲商品价格的洼地,连精明的瑞士人也开车到德国加油购物 一 2012年凤凰网组织十大著名博主前往澳洲考察并与前总理陆克文对话, ...
- codeforce
A. Playing with Dice time limit per test 1 second memory limit per test 256 megabytes input standard ...
- HDU-2711 Lost Cows
Lost Cows Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- Selenium WebDriver + Grid2 + RSpec之旅(二)----Grid2的配置
Selenium WebDriver + Grid2 + RSpec之旅(二) ----Grid2的配置 为什么要使用Selenium-Grid 分布式运行大规模的TestCase 能够通过一个中央节 ...
- ASP.NET (HttpModule,HttpHandler)
asp.net 事件模型机制 ----------------------- 一 客户的请求页面由aspnet_isapi.dll这个动态连接库来处理,把请求的aspx文件发送给CLR进行编译执行,然 ...
- [JLOI2013]卡牌游戏
[题目描述 Description] N个人坐成一圈玩游戏.一开始我们把所有玩家按顺时针从1到N编号.首先第一回合是玩家1作为庄家.每个回合庄家都会随机(即按相等的概率)从卡牌堆里选择一张卡片,假设卡 ...
- Android学习笔记(八)深入分析Service启动、绑定过程
Service是Android中一个重要的组件,它没有用户界面,可以运行在后太做一些耗时操作.Service可以被其他组件启动,甚至当用户切换到其他应用时,它仍然可以在后台保存运行.Service 是 ...
- 各种工具使得数据分析工作使用python变得越来越流行
请参看文章:http://strata.oreilly.com/2013/03/python-data-tools-just-keep-getting-better.html
- 转 wordpress搭建
新建一个博客文件 在搭建博客的过程中,我们需要创建一个文件,用来存储博客的相关信息.这些信息包括域名的信息,主机空间服务器ip,FTP登录名和密码,空间面板登录信息等等,只要是与该博客有关的信息,全部 ...
- JavaScript高级程序设计34.pdf
元素大小 偏移量 offsetHeight:元素在垂直空间上占用的大小,以像素计.包括元素的高度.(可见的)水平滚动条的高度.上边框高度和下边框高度. offsetWidth:元素在水平空间上占用的大 ...