实现简单的web服务器


      实现一个简单的Web服务器myhttpd,当浏览器向服务器请求文件时,服务器就从服务目录(例如/var/www)中找出相应的文件,加上HTTP协议头一起发给浏览器。服务器不发送完整的HTTP协议头。
       一、基本HTTP协议

          打开浏览器,输入服务器IP,例如 http://127.0.1.1 ,如果端口号不是80,例如是8000,则输入 http://127.0.1.1:8000 。这时浏览器向服务器发送的HTTP协议头如下:

       GET /favicon.ico HTTP/1.1
       Host: 127.0.1.1:8000
       User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:54.0) Gecko/20100101 Firefox/54.0
       Accept: */*
       Accept-Language: en-US,en;q=0.5
       Accept-Encoding: gzip, deflate
       Connection: keep-alive

         注意,其中每一行的末尾都是回车加换行(C语言的"\r\n"),第一行是GET请求和协议版本,其余几行选项字段我们不讨论,HTTP协议头的最后有一个空行,也是回车加换行。我们实现的Web服务器只要能正确解析第一行就行了,这是一个GET请求,请求的是服务目录
的根目录,Web服务器应该把该目录下的索引页(默认是index.html)发给浏览器,也就是把/var/www/index.html发给浏览器。假如该文件的内容如下(HTML文件没必要以"\r\n"换行,以"\n"换行就可以了):

        <html>
        <head><title>Test Page</title></head>
        <body>
        <p>Test OK</p>
        <img src='mypic.jpg'>
        </body>
        </html>

        显示一行字和一幅图片,图片的相对路径(相对当前的index.html文件的路径)是mypic.jpg,也就是/var/www/mypic.jpg,如果用绝对路径表示应该是:

        <img src='/mypic.jpg'>

        服务器应按如下格式应答浏览器:

        HTTP/1.1 200 OK
        Content-Type: text/html

        <html>
        <head><title>Test Page</title></head>
        <body>
        <p>Test OK</p>
        <img src='/mypic.jpg'>
        </body>
        </html>

        服务器应答的HTTP头也是每行末尾以回车加换行结束,最后跟一个空行的回车加换行。

        HTTP头的第一行是协议版本和应答码,200表示成功,后面的消息OK其实可以随意写,浏览器是不关心的,主要是为了调试时给开发人员看的。HTTP头的第二行表示即将发送的文件的类型(称为MIME类型),这里是text/html,纯文本文件是text/plain,图片则是image/jpg、image/png等,这个简单的服务器则只发送jpg图片。然后就发送文件的内容,发送完毕之后主动关闭连接,这样浏览器就知道文件发送完了。这一点比较特殊:通常网络通信都是客户端主动发起连接,主动发起请求,主动关闭连接,服务器只是被动地处理各种情况,而HTTP协议规定服务器主动关闭连接.

        浏览器收到index.html之后,发现其中有一个图片文件,就会再发一个GET请求。服务器收到这个请求应该把图片发过去然后关闭连接。

        总结一下服务器的处理步骤:

         1、  解析浏览器的请求,在服务目录中查找相应的文件,如果找不到该文件就返回404错误页面 。

         2、  发送HTTP/1.1 200 OK给客户端
         3、  如果是一个图片文件,根据图片的扩展名发送相应的Content-Type给客户端
         4、  如果不是图片文件,这里我们简化处理,都当作Content-Type: text/html
         5、  简单的HTTP协议头有这两行就足够了,再发一个空行表示结束
         6、  读取文件的内容发送到客户端
         7、  关闭连接

猜你喜欢

转载自www.cnblogs.com/liuzhenbo/p/11040463.html