服务器处理步骤
实现一个简单的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、 关闭连接