之前有javaeyer推荐了一本书《how tomcat works》,今天晚上看了看,确实不错,第一眼就着迷了。 于是乎就学着书上的例子敲了敲,学会了一个简单web服务器的大概实现,当然,这个简直就无法称之为web服务器,但是也算是走进web服务器的第一步吧。
这篇文章仅限于学习记录,文笔凌乱之处,还望各位见谅。 OK,下面进入正题;
开始之前,首先我们要清楚以下几个内容。
首先,一个最简单服务器包括三个部分:
web服务器----HttpServer
请求---Request
响应---Response
这个服务器如何使用:
1. 请求静态资源 通过 http://localhost:8090/index.html
成功 则返回页面, 否则会返回 File Not Found 的错误信息.
PS:比如上面的index.html 必须放在一个webroot目录下.
2. 服务器的关闭通过uri来处理
通过http://lcoalhost:8090/SHUTDOWN
这个Uri来停止服务器.
需要注意的其他几个知识点:
1. HTTP/1.1 协议的知识。 比如 请求,响应的结构。 发送与接收形式等.
2. Java中网络的相关只是 ServerSocket 与 Socket 的使用.
OK, 放上代码, 代码只有3个类,都挺简单的, 这个应用只是一个最最简单的雏形:
主类: HttpServer
package chapter1.simplewebserver;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.InterfaceAddress;
import java.net.ServerSocket;
import java.net.Socket;
/**
*
* 下午11:59:29
* @author gogole_09
* 简单web服务器
*/
public class HttpServer {
//定位到webroot目录
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 void await(){
ServerSocket serverSocket=null;
int port=8090;
try {
serverSocket=new ServerSocket(port,1,InetAddress.getByName("127.0.0.1"));
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
//监听端口,等待请求。
while(!shutdown){
Socket socket=null;
InputStream input=null;
OutputStream output=null;
try {
socket=serverSocket.accept();
//输入流 有过jsp编程的哥们都知道这是干嘛的
input=socket.getInputStream();
//输出流
output=socket.getOutputStream();
//构建请求
Request request=new Request(input);
//解析请求信息
request.parse();
//响应类
Response response=new Response(output);
response.setRequest(request);
response.sendStaticResource();
//处理完毕,关闭
socket.close();
//检查提供的URI是否为shutdown命令
shutdown=request.getUri().equals(SHUTDOWN_COMMAND);
} catch (Exception e) {
e.printStackTrace();
continue;
}
}
}
public static void main(String[] args) {
HttpServer server=new HttpServer();
server.await();
}
}
接下来是请求类:
Request
package chapter1.simplewebserver;
import java.io.IOException;
import java.io.InputStream;
/**
*
* 上午12:09:36
* @author gogole_09
* 简单服务器的请求类
*/
public class Request {
private InputStream input;
private String uri;
public Request(InputStream in) {
this.input=in;
}
/**
* 解析Uri操作
*/
public void parse() {
StringBuffer buf=new StringBuffer();
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++){
buf.append((char)buffer[j]);
}
System.out.println(buf.toString());
uri=parseUri(buf.toString());
}
/**
* 解析Uri
* 为什么要以' '为做标识 , 这里需要了解HTTP协议的相关结构;
* 一个请求行 以 请求方法开头 + 请求URI+ 请求协议版本 + CRLF字符结束
* 比如,你请求index.html 用GET方式 ,那么Uri形式为:
*
* GET /index.html HTTP/1.1
*
*
* @param requestString
* @return
*/
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;
}
}
有了请求了,服务器就得响应啊,试想,我发个请求没反应,你的第一反应是不是想砸电脑呢?
OK,Response类来了。
package chapter1.simplewebserver;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
/**
*
* 上午12:10:58
*
* @author gogole_09 简易服务器的响应类
*/
public class Response {
/**
* HTTP响应格式:= Status-Line
* *((general-header|response-header|entity-header)CRLF) CRLF [message-body]
* Status-Line=HTTP-Version SP(空格) Status-Code SP Reason-Phrase CRLF
*
*/
private static final int BUFFER_SIZE = 1024;
Request request;
private OutputStream output;
public Response(OutputStream output) {
this.output = output;
}
public void setRequest(Request request) {
this.request = request;
}
/**
* 服务器解析并发送静态资源
* @throws IOException
*/
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 {
//文件没找到
String errorMessage = "HTTP/1.1 404 File Not Found\r\n"
+ "Content-Type:text/html\r\n"
+ "Content-Length:23\r\n"+"\r\n<ht>File Not Found</h1>";
output.write(errorMessage.getBytes());
}
} catch (Exception e) {
System.out.println(e.toString());
}finally{
if(fis!=null)
fis.close();
}
}
}
OK,现在这个应用可以运行了,但是你运行起来,没办法用,为什么, 因为还需要有用户请求的静态资源。
在HttpServer类中,我们hard code了一个webroot目录,约定把所有的静态资源都放到这个目录下面的。
下面我们就把这个目录建好,并放一点资源进去 ,我是这样放的, 如图:
index.html 中 就只有一行代码:
OK, 下面我们运行一下 HttpServer ,得到页面 如下图:
在控制台,你将会看到程序打印出:
接着,我们尝试请求一个不存在的资源: 我们会的到一个404的错误页面.
OK, 一个简单的web服务器就完成了, 虽然简单,但是我们可以通过这个了解一个大概的流程。
以及复习一下java net包与HTTP/1.1协议的一些知识。
也希望这个篇文章对都有需要的人有帮助。
PS: 最近有很多朋友都问这本书哪里有买,我本人并非看的纸质的,而是电子版的, 需要下载的可以去新浪共享频道找找, 我的是从哪里下来的, 中文书名就叫 <tomcat工作原理>
- 大小: 6.5 KB
- 大小: 6.3 KB
- 大小: 22.1 KB
- 大小: 18 KB
- 大小: 64.2 KB
分享到:
相关推荐
j2ee应用服务器和web服务器解析 j2ee应用服务器和web服务器解析 Tomcat服务器是一个免费的开放源代码的Web应用服务器。因为Tomcat技术先进、性能稳定且免费,所以深受Java爱好者的喜爱并得到了部分软件开发商的认可...
你要知道Servlet规范相关的内容、Tomcat支持的各种特性配置、Web服务器(Apache、Nginx)等的配置,所有这些在实际工作中是必不可少的,如果每次出问题了才想起谷歌和百度,这自然是不行的。而如果有个完备的手册在...
Tomcat架构解析 基于Tomcat 8.5.x全面介绍了Tomcat的架构、各组件的实现方案以及使用方式,主要包括Tomcat的基础组件架构以及工作原理,Tomcat各组件的实现方案、使用方式以及详细配置说明,Tomcat与Web服务器集成...
Tomcat服务器报错对应值解析,tomcat服务器的常见错误对应值解析
都是由于对web容器的认知不足,本书基于Tomcat 8.5.6全面介绍了Tomcat的架构、各组件的实现方案以及使用方式,主要包括Tomcat的基础组件架构以及工作原理,Tomcat与Web服务器集成以及性能优化,Tomcat部分扩展特性...
在实际操作中,主要是Apache作为主服务器运行,当监听到有jsp或者servlet的请求时,将请求转发给tomcat服务器,由tomcat服务器进行解析后,发回apache,再由apache发回用户。 在tomcat中有两个监听的端口,一个是...
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台...
轻量级服务器架构全面解析 Tomcat与Web服务器集成及性能优化
用于学习tomcat服务器的Web服务器 :light_bulb: 介绍 这个项目很小,最多不超过5000行,但涵盖了Web服务器的许多功能,并且完全由Java编写,适合新手学习Java和Web服务器知识 :sparkles: 特征 :magnifying_glass_...
适合读者 1.jsp/servlet 开发人员,想了解 tomcat 内部机制的 coder; 2.想加入 tomcat 开发团队的 coder;...3.web 开发人员,但对软件开发很有兴趣的 coder; 4.想要对 tomcat 进行定制的 coder。
资源包括Tomcat服务器、mysql安装包与编码集格式、java-web的文档与web需要的一些jar包(日志文件、数据连接池、jstl、jQuery-js文件、json、解析器工厂)
Apache Group在完成GNUJSP1.0的开发以后,开始考虑在SUN的JSWDK基础上开发一个可以直接提供Web服务的JSP服务器,当然同时也支持Servlet, 这样Tomcat就诞生了。Tomcat是jakarta项目中的一个重要的子项目,其被...
Tomcat是目前比较流行的Web服务器之一。作为一个开源和小型的轻量级应用服务器,Tomcat 易于使用,便于部署,但Tomcat本身是一个非常复杂的系统,包含了很多功能模块。这些功能模块构成了Tomcat的核心结构。《深入...
整合Apache和Tomcat可以看作是用Tomcat做Apache的jsp/servlet解析插件,将两者优势...不过Tomcat作为一个Web服务器,本身具备了基本的Web服务功能,在SUN的力推下,将来或许越来越强壮到不需要借助Apache优势的地步。
随着Web2.0、社交网络...黑客利用网站操作系统的漏洞和Web服务程序的SQL注入漏洞等得到Web服务器的控制权限,轻则篡改网页内容,重则窃取重要内部数据,更为严重的则是在网页中植入恶意代码,使得网站访问者受到侵害。
在实际操作中,主要是Apache作为主服务器运行,当监听到有jsp或者servlet的请求时,将请求转发给tomcat服务器,由tomcat服务器进行解析后,发回apache,再由apache发回用户。 在tomcat中有两个监听的端口,一个是...
扩展名".jsp"(需要tomcat解析的所有扩展名) 如果有多个请重复执行添加操作 6.新建虚拟目录"jakarta" 在刚建好的站点上新建虚拟目录"jakarta" 路径指到到tomcat安装目录下的conf文件夹 允许权限(读取,运行脚本,执行)...
基于HTTP协议的WEB服务器,简易版的Tomcat.服务端读取配置文件完成对服务 器的初始化,并通过Socket网络编程架构服务器端.浏览器作为客户端,向服务器发送请求.服务端接受请求并将其封装为一个HTTPRequest对象,并对其...
1.web.xml内容修改,添加servlet标签 2.添加Servlet接口与实现 3.解析web.xml 4.修改启动时逻辑,扫描全部servlet 5.Request、Response 说明 6.动态处理请求,通过反射创建Servlet 7.浏览器测试