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


        我又回来做笔记了~最近懒死了,书虽然看完了,但是一直懒得动笔,这样不行啊(¯﹃¯)口水。还有在这里吐槽下,在围观这本书的时候,一直有一种奇怪的感觉:里面说的有些东西与时代脱节啊......越读越感觉不对劲,最后终于在一个月黑风高的夜晚,我发现了一个惊人的秘密,那就是....这本书的英文版是在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的响应报文:

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

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

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

  • 相关阅读:
    EasyUI 清空表格
    【21年01月DW打卡】Task02
    【BUG12】排查解决一个锁超时 "MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction" 的SQL问题
    【20年12月DW打卡】joyful-pandas
    【21年01月DW打卡】Task01
    【12月DW打卡】joyful-pandas
    【12月DW打卡】joyful-pandas
    【Pandas】resample重采样中的周‘W’按周日开始为一周('W'的频率偏移默认为‘right’、使用label = 'left' 重设)+ 常用freq的别名/注释
    【12月DW打卡】joyful-pandas
    【12月DW打卡】joyful-pandas
  • 原文地址:https://www.cnblogs.com/littlewish/p/2882173.html
Copyright © 2020-2023  润新知