一个简单的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服务器例子的更多相关文章

  1. 自己动手模拟开发一个简单的Web服务器

    开篇:每当我们将开发好的ASP.NET网站部署到IIS服务器中,在浏览器正常浏览页面时,可曾想过Web服务器是怎么工作的,其原理是什么?“纸上得来终觉浅,绝知此事要躬行”,于是我们自己模拟一个简单的W ...

  2. 一个简单的web服务器

    写在前面 新的一年了,新的开始,打算重新看一遍asp.net本质论这本书,再重新认识一下,查漏补缺,认认真真的过一遍. 一个简单的web服务器 首先需要引入命名空间: System.Net,关于网络编 ...

  3. [置顶] 在Ubuntu下实现一个简单的Web服务器

    要求: 实现一个简单的Web服务器,当服务器启动时要读取配置文件的路径.如果浏览器请求的文件是可执行的则称为CGI程序,服务器并不是将这个文件发给浏览器,而是在服务器端执行这个程序,将它的标准输出发给 ...

  4. Tomcat剖析(一):一个简单的Web服务器

    Tomcat剖析(一):一个简单的Web服务器 1. Tomcat剖析(一):一个简单的Web服务器 2. Tomcat剖析(二):一个简单的Servlet服务器 3. Tomcat剖析(三):连接器 ...

  5. 自己模拟的一个简单的web服务器

    首先我为大家推荐一本书:How Tomcat Works.这本书讲的很详细的,虽然实际开发中我们并不会自己去写一个tomcat,但是对于了解Tomcat是如何工作的还是很有必要的. Servlet容器 ...

  6. 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中创 ...

  7. 利用 nodeJS 搭建一个简单的Web服务器(转)

    下面的代码演示如何利用 nodeJS 搭建一个简单的Web服务器: 1. 文件 WebServer.js: //-------------------------------------------- ...

  8. 《深度解析Tomcat》 第一章 一个简单的Web服务器

    本章介绍Java Web服务器是如何运行的.从中可以知道Tomcat是如何工作的. 基于Java的Web服务器会使用java.net.Socket类和java.net.ServerSocket类这两个 ...

  9. 一个简单的Web服务器-支持Servlet请求

    上接 一个简单的Web服务器-支持静态资源请求,这个服务器可以处理静态资源的请求,那么如何处理Servlet请求的呢? 判断是否是Servlet请求 首先Web服务器需要判断当前请求是否是Servle ...

随机推荐

  1. SAS软件的使用和统计学分析的初步介绍

           一般而言我们都会使用Excel来统计测试结果,除了Excel之外,还有SAS等软件,也是可以统计测试结果的,本人也是SAS的初学者,现在我就给大家介绍一下SAS的简单使用,随着我不断的学 ...

  2. Selenium - WebDriver 小结(1)

    public class Base { SimpleDateFormat formatterTime = new SimpleDateFormat("yyyyMMdd_hhmmssa&quo ...

  3. Red5空项目的理解

    在经过三天的苦恼之后,我终于对Red5的工作流程有点了解了.这样一来对要做的项目总算不会太瞎了.出于个人感受,认为下面所讲述的内容对初学者理解Red5以及基于Red5开发有很大的帮助,因此记录下来. ...

  4. 删除顺序链表中重复的数 (一) leecode

    Given a sorted linked list, delete all duplicates such that each element appear only once. For examp ...

  5. bzoj 1027 [JSOI2007]合金(计算几何+floyd最小环)

    1027: [JSOI2007]合金 Time Limit: 4 Sec  Memory Limit: 162 MBSubmit: 2970  Solved: 787[Submit][Status][ ...

  6. No valid host was found

    set in nova.conf -> scheduler_default_filters=AllHostsFilter Tried without success.

  7. 【SQL】MySQL内置函数中的字符串函数和日期时间函数

    字符串函数 --拼接字符串组成新的字符串 Select concat(‘A’,’B’); --返回字符串长度 Select length(“CAT”) --返回子字符串在字符串中首次出现的位置,没有返 ...

  8. iOS9上的Universal Link实现(教程)

    1.Universal Link 理解为苹果官方支持deeplink就行了 2.通过点击HTTP链接启动APP Web・iOS应用在支持Universal Link的前提下,当用户点击特点的链接时会自 ...

  9. uva 1030 - Image Is Everything(迭代更新)

    题目链接:uva 1030 - Image Is Everything 题目大意:有一个最大为n*n*n的立方体的一个不规整立体,由若干个1*1*1的小正方体构成(每一个小正方体被涂成不同的颜色),给 ...

  10. GWT 实现文件上传和下载

    首先下载两个包 commons-fileupload-?.jar和commons-io-?.jar  将他们配置到你的项目中 先把它们放在 "项目名/war/WEB-INF/lib" ...