我又回来做笔记了~最近懒死了,书虽然看完了,但是一直懒得动笔,这样不行啊(¯﹃¯)口水。还有在这里吐槽下,在围观这本书的时候,一直有一种奇怪的感觉:里面说的有些东西与时代脱节啊......越读越感觉不对劲,最后终于在一个月黑风高的夜晚,我发现了一个惊人的秘密,那就是....这本书的英文版是在2002年出版的啊....怪不得...所以说里面的有些东西应该说已经过时。这个故事告诉我们一个深刻的道理:一定要好好学英语!

废话不多说,来看看今天的主要内容:

 WEB服务器

    web服务器是我们每天浏览的这些网页的基础,它接收用户的请求,处理,最后向客户发回响应,常见的web服务器有IIS,apache,Nginx等等,这里说明下apache与tomcat的区别:Apache是web服务器,Tomcat是应用(java)服务器,它只是一个servlet容器,是Apache的扩展。 Apache和Tomcat都可以做为独立的web服务器来运行,但是Apache不能解释java程序(jsp,serverlet)。两者都是一种容器,只不过发布的东西不同:Apache是html容器,功能像IIS一样;Tomcat是jsp/servlet容器,用于发布jsp及java的,类似的有IBM的websphere、BEA的Weblogic,sun的JRun等等。

web服务器进行服务时候的主要步骤

  1. 建立连接——接收一个客户端连接
  2. 接受请求——从网络中读取一条HTTP请求报文
  3. 处理请求——对请求报文进行解析,并进行下一步工作
  4. 访问资源——访问请求报文中指定的资源
  5. 构建响应——创建正确的响应报文
  6. 发送响应——将响应发回客户端
  7. 记录事务过程——将与完成事务有关的信息记录在日志中。

当客户端与服务器建立连接成功以后,客户端会向服务器发出其请求报文,这个请求报文中包含着以特定格式记录的请求信息,如请求行,请求首部,以及请求实体。当服务器接收完请求报文之后,按照约定格式对请求进行解析,了解客户端需要的东西。服务器有很多种类:单线程,多线程多进程,复用结构,服用多线程结构。多线程多进程服务器为每一个连接都提供了一个线程或者进程,对其进行监控处理。复用结构服务器会监视所有的连接,但是只有连接状态发生变化时才会对连接进行处理,连接空闲或者等待的时候并不会绑定线程或者进程。复用多线程服务器将他们两个的特点结合到一起,更高效的利用资源。

通常客户端会请求一些资源,如图片等,当服务器解析完客户端的请求之后,便会寻找客户端请求的资源,寻找资源的方法有很多种,可以使用docroot对路径补全,以寻找目标文件在服务器上的真实路径并访问,当然也有一台服务器上有很多站点的情况,这时便可以使用虚拟主机对docroot进行配置,也可以使用CGI访问动态的服务器资源。

获得想要访问的资源或者被拒绝之后,根据结果构建响应报文,最后将构建好的响应报文回送给客户端。

下面是一个用JAVA实现的简单web服务器demo:

 1 import java.io.DataInputStream;
 2 import java.io.PrintStream;
 3 import java.net.ServerSocket;
 4 import java.net.Socket;
 5 public class WebServer {
 6
 7     /**
 8      * @param args
 9      */
10     public static void main(String[] args) {
11         // TODO Auto-generated method stub
12         //i对线程标记,port为监听的机器端口号
13         int i=1,port=80;
14         ServerSocket serverSocket=null;
15         Socket socket=null;
16         try {
17             //新建一个服务器监听对象
18             serverSocket=new ServerSocket(port);
19             System.out.println("listening!!");
20             //连续监听客户端请求
21             while (true) {
22                 socket=serverSocket.accept();//这里会等待客户端的请求
23                 new ConnectionThread(socket, i).start();//一旦接受到客户端请求,便开启请求事务处理线程对请求进行异步处理
24                 i++;
25             }
26         } catch (Exception e) {
27             // TODO: handle exception
28         }
29     }
30 }
31 //事务处理线程
32 class ConnectionThread extends Thread{
33     Socket socket=null;
34     int count;
35     public ConnectionThread(Socket s,int i) {
36         // TODO Auto-generated constructor stub
37         socket=s;
38         count=i;
39     }
40     public void run() {
41         try {
42             String ip=socket.getInetAddress().toString();//获取ip
43             int destport=socket.getPort();//获取端口
44             System.out.println("Client:"+ip+":"+destport);
45             PrintStream outStream=new PrintStream(socket.getOutputStream());//获取输出流
46             DataInputStream inStream=new DataInputStream(socket.getInputStream());//获取输入流
47             StringBuilder inString=new StringBuilder();
48             String temp;
49             //打印接收到的请求
50             while (!(temp=inStream.readLine()).equals("")) {
51                 inString.append(temp+"\n");
52             }
53             System.out.println("Request:\n"+inString.toString());
54             //向客户端返回特定的响应首部
55             outStream.println("HTTP/1.0 200 OK");
56             outStream.println("Content-Type:text/html");
57             outStream.println("Content-Length:"+"This is a test!!".length());
58             outStream.println("");
59             outStream.println("This is a test!!");
60             outStream.flush();
61         } catch (Exception e) {
62             // TODO: handle exception
63         }
64     }
65 }

访问localhost的请求报文:

demo的响应报文:

页面效果就是显示一句话:

可以看到,响应报文的传输方法就是按一定格式通过流进行传送。

这章没什么好说的,就到这里咯~

转载于:https://www.cnblogs.com/littlewish/archive/2013/01/29/2882173.html

web服务器的简单实现——HTTP权威指南读书心得(七)相关推荐

  1. java webserver demo_Java 实现 web服务器的简单实例

    Java 实现 web服务器的简单实例 实例代码: import java.util.*; // Chapter 8, Listing 3 public class WebServerDemo { / ...

  2. 《web应用安全权威指南》心得

    0x00:简介 <web应用安全权威指南>是日本的德丸浩先生以一位Web开发人员的视角,较为详尽的介绍了Web应用中常见的安全问题与解决对策. 自己花时间,仔细的阅读并梳理了所掌握的Web ...

  3. HTTP权威指南读书笔记

    <<HTTP权威指南>>读书笔记 第一部分:Web的基础 第1章:HTTP概述 主要内容 1.什么是HTTP 2.HTTP的基本组件 HTTP HTTP:HTTP(Hypert ...

  4. MongoDB权威指南读书笔记——CRUD

    插入并保存文档 插入是向MongoDB中添加数据的基本方法.可以使用Insert方法向目标集合插入一个文档:db.foo.insert({"bar" : "baz&quo ...

  5. HTML5权威指南----读书笔记

    <!DOCTYPE html> <html> <head><meta name = 'keywords' content="HTML5权威指南--- ...

  6. mysql数据库权威指南_MySQL_MySQL权威指南读书笔记(三),第二章:MYSQL数据库里面的数 - phpStudy...

    MySQL权威指南读书笔记(三) 第二章:MYSQL数据库里面的数据 用想用好MYSQL,就必须透彻理解MYSQL是如何看待和处理数据的.本章主要讨论了两个问题:一是SQL所能处理的数据值的类型:二是 ...

  7. [原创]Java性能优化权威指南读书思维导图

    [原创]Java性能优化权威指南读书思维导图 书名:Java性能优化权威指南 原书名:Java performance 作者: (美)Charlie Hunt    Binu John 译者: 柳飞 ...

  8. Web应用安全权威指南读书思维导图

    拜读完了德丸浩的<Web应用安全权威指南>,果然如序中所写,"德丸本"名不虚传 由于有些图片过大,不得不进行压缩后再上传难免失真,如果难以看清可以联系我获取PDF版本

  9. 计算机网络和http权威指南 读书笔记

    计算机网络笔记 网络层 网络层向上提供无连接的,尽最大努力交付的数据报服务 网络层不提供数据质量承诺 物理层使用的中间设备叫转发器repeater 数据链路层叫网桥bridge 网络层叫路由器rout ...

最新文章

  1. 活久见!谷歌开源“大杀器”,CV、NLP都能用!
  2. C++ 构造函数的初始化列表
  3. [笔记]C#基础入门(五)——算法:交换
  4. 如何突破JAVA程序员的分水岭
  5. mysql对库授权alter_mysql 数据库授权(给某个用户授权某个数据库)
  6. NLP新秀:BERT的优雅解读
  7. 博客系统评论模块列表转树形结构
  8. docker kafka互通有问题_Docker搭建kafka集群
  9. 《SolidWorks 2017中文版机械设计从入门到精通)》——1.6 参考基准轴
  10. 笔记本电脑散热器声音很大怎么办_笔记本电脑长时间高温运行有什么危害
  11. linux文件系统的总体架构,Linux NFS的整体架构与核心代码解析
  12. 【数字信号调制】基于matlab正交幅度调制仿真【含Matlab源码 1002期】
  13. 短信业务 ——HTTP接口文档
  14. VBS:UBound()函数
  15. 基于Django搭建Python web项目——项目创建及配置(一)
  16. win 10使用模拟器蓝屏解决方案
  17. 代码实现-CVPR2020-Dynamic Convolution: Attention over Convolution Kernels
  18. MATLAB 多项式计算
  19. 神经网络和pid有什么区别,基于神经网络的pid控制
  20. 屡胜姜子牙的二位妖将,竟是5G应用的先驱?

热门文章

  1. hashmap为什么是2的倍数_HashMap源码解析(jdk1.8)
  2. 一维数组求最大值,和三元运算符运算源码
  3. 华为鸿蒙等不急了,华为最强巨作,鸿蒙OS+六摄+麒麟985,网友:等不及了!
  4. python 列表转图结构_Python读取网络(图)边列表数据进而转化为邻接矩阵
  5. 什么是编译器?(程序是怎么跑起来的)
  6. leetcode1045. 买下所有产品的客户(SQL)
  7. 如何在博客内添加音乐
  8. Pytorch(5)-梯度反向传播
  9. 大数据学习(3)- 分布式文件系统HDFS
  10. Java设计模式(3 / 23):装饰者模式