一个简单的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 ...
随机推荐
- 算法 python实现(三) 快速排序
算法学起来真费劲啊,智商只够捉只鸡的.昨晚没看明白就没电了,过两天要考虑偷电了... 今天看看快速排序,有一个博客写的很好,通俗生动形象,适合我这样的算法大白菜.推荐一下 http://www.cnb ...
- XPath在asp.net中查询XML -摘自网络
.NET Framework 2.0中可以使用System.Xml.XPath命名空间下的类对XML文档进行基于路径的查询,在查询过程中需要构造类似SQL的查询字符串,该字符串遵循XPath语法.它由 ...
- Uber能知道你是不是在开车的时候玩手机
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 问题-[Delphi]SendMessageTimeout调用后卡住点击任务栏还会出现窗体处理
问题现象:在使用SendMessageTimeout函数后,5秒后WIN把进程挂在起.这时把程序最小化(原因就是不想让用户看到卡的界面),但点击任务栏按钮界面还原了,拦截消息失败(原因是挂起后消息都放 ...
- 什么时候使用Shell
因为Shell似乎是各UNIX系统之间通用的功能,并且经过了POSIX的标准化.因此,Shell脚本只要“用心写”一次,即可应用到很多系统上.因此,之所以要使用Shell脚本是基于: 简单性:Shel ...
- RGB同步信号 DCLK/HS/VS/DE信号介绍
来源: http://www.cnblogs.com/general001/articles/3721683.html 只要是数字信号处理电路,就必须有时钟信号.在液晶面板中,像素时钟是一个非常重要 ...
- uvaoj 10397 - Connect the Campus【最小生成树】
uvaoj 10397 - Connect the Campus Many new buildings are under construction on the campus of the Univ ...
- Yii2 验证码
没有用默认的layout 验证码点击不会改变 下面是静态页面代码 <div class="col-sm-12 login"> <div class=" ...
- (转)Zend Studio 10.6.1破解注册图文详解
原文来自:http://www.softown.cn/soft/zend-studio/windows/10.6.1#downloads 下面我们以Zend Studio 10.6.1正式版为例来介绍 ...
- VS扩展CodeMaid代码整理插件
本文章转载:http://www.cnblogs.com/wintersun/p/3577039.html 官方地址:http://www.codemaid.net/ 开源VS扩展CodeMaid介绍 ...