进来在看《How Tomcat Works》这本书,将读书笔记贴在这里,好记性不如烂笔头。 
最简单的一个服务器,一个很简单的结果。 
HttpServer构建ServerSocket,每次当请求到来是创建一个Socket,并创建Request,Response对象,根据URI读取位于WebRoot底下的静态资源。 
类如下:

Java代码  
  1. package com.ex01.pyrmont;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.io.OutputStream;
  5. import java.net.InetAddress;
  6. import java.net.ServerSocket;
  7. import java.net.Socket;
  8. import java.net.UnknownHostException;
  9. public class HttpServer {
  10. public final static String WEB_ROOT = "webRoot";
  11. public final static String SHUT_DOWN = "/SHUTDOWN";
  12. private boolean shutdown = false;
  13. public static void main(String[] args) {
  14. HttpServer httpServer = new HttpServer();
  15. httpServer.await();
  16. }
  17. public void await() {
  18. int port = 8080;
  19. ServerSocket serverSocket = null;
  20. try {
  21. serverSocket = new ServerSocket(port,1,InetAddress.getByName("127.0.0.1"));
  22. } catch (UnknownHostException e) {
  23. e.printStackTrace();
  24. System.exit(1);
  25. } catch (IOException e) {
  26. System.exit(1);
  27. }
  28. Socket socket = null;
  29. InputStream input;
  30. OutputStream out;
  31. while(!shutdown){
  32. try {
  33. socket = serverSocket.accept();
  34. input = socket.getInputStream();
  35. out = socket.getOutputStream();
  36. Request request = new Request(input);
  37. request.parse();
  38. Response response = new Response(out);
  39. response.setRequest(request);
  40. response.sendStaticResource();
  41. input.close();
  42. out.close();
  43. socket.close();
  44. shutdown = request.getUri().equals(SHUT_DOWN);
  45. } catch (IOException e) {
  46. e.printStackTrace();
  47. }
  48. }
  49. }
  50. }
Java代码  
  1. package com.ex01.pyrmont;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. public class Request {
  5. private InputStream input;
  6. private String uri;
  7. public Request() {}
  8. public Request(InputStream input){
  9. this.input = input;
  10. }
  11. public void parse(){
  12. StringBuffer buffer =  new StringBuffer(2048);
  13. byte[] buf = new byte[2048];
  14. int len = 0;
  15. try {
  16. len = input.read(buf);
  17. } catch (IOException e) {
  18. len = 0;
  19. e.printStackTrace();
  20. }
  21. for(int i = 0; i < len; i++){
  22. buffer.append((char)buf[i]);
  23. }
  24. uri = parseUri(buffer.toString());
  25. }
  26. private String parseUri(String uriStr){
  27. int spaceIndex = uriStr.indexOf(" ");
  28. if(spaceIndex != -1){
  29. int spaceSecondIndex = uriStr.indexOf(" ", spaceIndex + 1);
  30. if(spaceSecondIndex > spaceIndex){
  31. return uriStr.substring(spaceIndex + 1,spaceSecondIndex);
  32. }
  33. }
  34. return null;
  35. }
  36. public String getUri(){
  37. return uri;
  38. }
  39. }
Java代码  
  1. package com.ex01.pyrmont;
  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.IOException;
  5. import java.io.OutputStream;
  6. public class Response {
  7. public final static int BUFFER_SIZE = 2048;
  8. private OutputStream out;
  9. private Request request;
  10. public Response() {}
  11. public Response(OutputStream out) {
  12. this.out = out;
  13. }
  14. public void sendStaticResource() throws IOException {
  15. String uri = request.getUri();
  16. FileInputStream fis = null;
  17. File file = new File(HttpServer.WEB_ROOT, uri);
  18. if (file.exists()) {
  19. fis = new FileInputStream(file);
  20. byte[] buf = new byte[BUFFER_SIZE];
  21. int len = fis.read(buf);
  22. while (len != -1) {
  23. out.write(buf, 0, len);
  24. len = fis.read(buf);
  25. }
  26. } else {
  27. // file not found
  28. String errorMessage = "HTTP/1.1 404 File Not Found\r\n"
  29. + "Content-Type: text/html\r\n" + "Content-Length: 23\r\n"
  30. + "\r\n" +
  31. "<h1>File Not Found</h1>";
  32. out.write(errorMessage.getBytes());
  33. }
  34. if(fis != null){
  35. fis.close();
  36. }
  37. }
  38. public void setRequest(Request request) {
  39. this.request = request;
  40. }
  41. }

上面的程序比较简单,但也有一定的问题: 
1. 比如获取URI的过程,感觉就很不好,没有一定的容错性 
2. 异常的处理比较混乱等 
虽然这些tomcat都得到了很好的处理,并且有很多值得借鉴的地方,但是思考一下到后面估计和它有一定的共鸣。

源码在google这里面有http://www.google.com/codesearch/p?hl=en&sa=N&ct=rx&cd=9#X8Q3DKkF7lI/HowTomcatWorks/:java

声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
返回顶楼

进来在看《How Tomcat Works》这本书,将读书笔记贴在这里,好记性不如烂笔头。相关推荐

  1. linux内核设计与实现看不懂,Linux内核设计与实现读书笔记

    Unix强大的根本原因: Unix简洁, 提供几百个系统调用, 设计目的明确 Unix中 所有东西都被当做文件对待 Unix内核和相关系统工具是用C语言开发的, 移植能力强大 Unix进程创建迅速, ...

  2. 《练好口才的第一本书》-读书笔记及感悟

    当众讲话的四大痛点--胆.声.情.识 如何练习微笑 最简单的办法就是练习说"引"字.因为"引"字是前鼻音,发音时,鼻子的肌肉一动,自然就带动眉眼的肌肉运动,也就 ...

  3. 推荐一款看书学习必备的读书笔记app

    如果你是看网络小说这种没有深度的书籍倒是不需要做笔记,但是很明显我们看书不仅仅是消遣时间.既然如此那就需要我们在阅读时能随时随地记录下自己的灵感. 你在应用商店里搜索"笔记"大都出 ...

  4. 深入剖析Tomcat(How Tomcat Works)

    <深入剖析Tomcat>前言(作者:Budi Kurniawan & Paul Deck) 欢迎阅读本书.本书剖析了Tomcat 4.1.12版本和Tomcat 5.0.18版本的 ...

  5. 《How Tomcat Works》读书笔记(三)Connector

    为什么80%的码农都做不了架构师?>>>    3.1 StringManager 为啥要先讲StringManager呢? 话说tomcat算是一个大型项目了(最新的tomcat7 ...

  6. 《How Tomcat Works》读书笔记(三)--Connector(连接器)

    <How Tomcat Works>读书笔记(三)--Connector(连接器) 这是<How Tomcat Works>第三四章的读书笔记.主要写了Tomcat4.0默认的 ...

  7. How Tomcat works — 四、tomcat启动(3)

    上一节说到StandardService负责启动其子组件:container和connector,不过注意,是有先后顺序的,先启动container,再启动connector,这一节先来看看conta ...

  8. How Tomcat Works(十一)

    本文接下来分析tomcat的类载入器,tomcat需要实现一个自定义的载入器,而不能使用系统类载入器 (1)限制serlvet访问当前运行的java虚拟机中环境变量CLASSPATH指明的路径下的所有 ...

  9. 《How Tomcat Works》读书笔记(二)

    <How Tomcat Works>读书笔记(二) 这是<How Tomcat Works>第一二章的读书笔记.第一张主要写了一个静态资源处理的web服务器,第二章加了对ser ...

最新文章

  1. 从壹开始微服务 [ DDD ] 之一 ║ D3模式设计初探 与 我的计划书
  2. session与cookie的区别
  3. 为什么现在电脑基本没有病毒了?
  4. java如何开根号?
  5. Excel永远不会消亡!
  6. redis-trib.rb 使用详解
  7. ajax到底怎么读呢
  8. linux mysql cnf_mysql在linux下查看my.cnf位置的方法
  9. 枪林弹雨 该服务器维护中,枪林弹雨登陆BUG解决方法
  10. Compact Multi-Signatures for Smaller Blockchains学习笔记
  11. 周大福心动珠宝,请接收爱的讯号
  12. Kettle基本使用(四) —— 应用的使用
  13. PHP打开word文档
  14. 使用@Aspect不起作用
  15. 智能微模块一体化机柜
  16. 学计算机语言步骤,如何学编程语言?好菜鸟学习编程语言的步骤
  17. web常见错误解决方法
  18. 解决github.com 的响应时间过长
  19. altera FPGA介紹
  20. 13 个最好用的免费服务器和网络监控工具,不看吃亏!

热门文章

  1. mysql在建站起什么作用_数据库操作对比:Sql Server与MYSQL相比有哪些建站优势?...
  2. 运维企业专题(10)RHCS集群工具——FENCE搭建、高可用服务配置详解
  3. 教程:16、信号机制与信号处理
  4. java单链表输出_数据结构基础------1.线性表之单链表的创建与输出方法(Java版)...
  5. python累加求和_李老师带你学Python-第二课 如何编写Python程序
  6. python如何安装各类包_如何在Python中列出所有已安装的包及其版本?
  7. java集合 stack_Java集合之Stack
  8. 邻接矩阵中啥时候写0和无穷_集合中的上极限与下极限
  9. java 设置宽度和高度,如何通过设置高度和宽度来使宽度和高度反映ScaleTransform以及如何进行ScaleTransform?...
  10. Codeforces #449 div2 C题