视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
web服务器的具体介绍
2020-11-27 15:31:24 责编:小采
文档


1.HTTP协议介绍

HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写。它的发展是万维网协会(World Wide Web Consortium)和Internet工作小组IETF(Internet Engineering Task Force)合作的结果,(他们)最终发布了一系列的RFC,RFC 1945定义了HTTP/1.0版本。其中最著名的就是RFC 2616。RFC 2616定义了今天普遍使用的一个版本——HTTP 1.1。

HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。

  • HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。

  • HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。

  • HTTP是一个无状态的协议。

  • ![Upload 深入理解HTTP协议.jpg failed. Please try again.]


    HTTP协议永远都是客户端发起请求,服务器回送响应。


    这样就了使用HTTP协议,无法实现在客户端没有发起请求的时候,服务器将消息推送给客户端。
    HTTP协议是一个无状态的协议,同一个客户端的这次请求和上次请求是没有对应关系。

    2.http协议分析

    1.浏览器请求


    http请求办法


    我们可以跟数据库的CRUD增删改查操作对应起来:

    1. CREATE :PUT

    2. READ:GET

    3. UPDATE:POST

    4. DELETE:DELETE

    2.服务器响应

    HTTP响应分为Header和Body两部分(Body是可选项),我们在Network中看到的Header最重要的几行如下:
    HTTP/1.1 200 OK
    200表示一个成功的响应,后面的OK是说明。
    如果返回的不是200,那么往往有其他的功能,例如

  • 失败的响应有404 Not Found:网页不存在

  • 500 Internal Server Error:服务器内部出错

  • ...等等...


  • HTTP状态码.jpg


    Content-Type: text/html
    Content-Type指示响应的内容,这里是text/html表示HTML网页。

    3.浏览器解析过程

    当浏览器读取到新浪首页的HTML源码后,它会解析HTML,显示页面,然后,根据HTML里面的各种链接,再发送HTTP请求给新浪服务器,拿到相应的图片、视频、Flash、JavaScript脚本、CSS等各种资源,最终显示出一个完整的页面。

    3.总结

    1.HTTP请求流程

    跟踪了新浪的首页,我们来总结一下HTTP请求的流程:

    步骤1:浏览器首先向服务器发送HTTP请求,请求包括:

    方法:GET还是POST,GET仅请求资源,POST会附带用户数据;
    路径:/full/url/path;
    域名:由Host头指定:Host: www.sina.com
    以及其他相关的Header;
    如果是POST,那么请求还包括一个Body,包含用户数据

    步骤2:服务器向浏览器返回HTTP响应,响应包括:

    响应代码:200表示成功,3xx表示重定向,4xx表示客户端发送的请求有错误,5xx表示服务器端处理时发生了错误;
    响应类型:由Content-Type指定;
    以及其他相关的Header;
    通常服务器的HTTP响应会携带内容,也就是有一个Body,包含响应的内容,网页的HTML源码就在Body中。

    步骤3:如果浏览器还需要继续向服务器请求其他资源,比如图片,就再次发出HTTP请求,重复步骤1、2。

    Web采用的HTTP协议采用了非常简单的请求-响应模式,从而大大简化了开发。当我们编写一个页面时,我们只需要在HTTP请求中把HTML发送出去,不需要考虑如何附带图片、视频等,浏览器如果需要请求图片和视频,它会发送另一个HTTP请求,因此,一个HTTP请求只处理一个资源(此时就可以理解为TCP协议中的短连接,每个链接只获取一个资源,如需要多个就需要建立多个链接)
    HTTP协议同时具备极强的扩展性,虽然浏览器请求的是的首页,但是新浪在HTML中可以链入其他服务器的资源,比如![](http://upload-images.jianshu.io/upload_images/6078268-6060a9b222ef1412.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240),从而将请求压力分散到各个服务器上,并且,一个站点可以链接到其他站点,无数个站点互相链接起来,就形成了World Wide Web,简称WWW。

    2.HTTP格式


    客户端请求信息
    服务端响应消息
  • 每个HTTP请求和响应都遵循相同的格式,一个HTTP包含Header和Body两部分,其中Body是可选的。

  • HTTP协议是一种文本协议,所以,它的格式也非常简单。
    HTTP GET请求的格式:
    GET /path HTTP/1.1
    Header1: Value1
    Header2: Value2
    Header3: Value3
    每个Header一行一个,换行符是\r\n或者用os.linesep
    HTTP POST请求的格式:
    POST /path HTTP/1.1
    Header1: Value1
    Header2: Value2
    Header3: Value3

    body data goes here...
    当遇到连续两个\r\n时,Header部分结束,后面的数据全部是Body。
    HTTP响应的格式:
    200 OK
    Header1: Value1
    Header2: Value2
    Header3: Value3

    body data goes here...
    HTTP响应如果包含body,也是通过\r\n\r\n来分隔的。
    请再次注意,Body的数据类型由Content-Type头来确定,如果是网页,Body就是文本,如果是图片,Body就是图片的二进制数据。
    当存在Content-Encoding时,Body数据是被压缩的,最常见的压缩方式是gzip,所以,看到Content-Encoding: gzip时,需要将Body数据先解压缩,才能得到真正的数据。压缩的目的在于减少Body的大小,加快网络传输。

    4Web静态服务器

    1.显示固定的页面

  • import socketimport multiprocessingimport osimport timedef serverHandler(clientSocket, clientAddr):'与请求的客户端进行交互'# 接收客户端发来的消息
     recvData = clientSocket.recv(1024).decode('utf-8')
     print(recvData)# 服务端向客户端发消息,作为响应
     responseLine = 'HTTP/1.1 200 OK' + os.linesep
     responseHeader = 'Server: laowang' + os.linesep
     responseHeader += 'Date: %s' % time.ctime() + os.linesep
     responseBody = '差一点一米八'
     sendData = (responseLine + responseHeader + os.linesep + responseBody).encode('gbk')
    
     clientSocket.send(sendData)# 关闭
     clientSocket.close()def main():'程序入口'# socket对象
     serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 绑定的端口号,可以重复使用端口号#serverSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)# 绑定
     serverSocket.bind(('', 8000))# 监听
     serverSocket.listen()while True:# 接收
     clientSocket, clientAddr = serverSocket.accept()
     print(clientSocket)# 开一个新的进程,执行交互
     multiprocessing.Process(target=serverHandler, args=(clientSocket, clientAddr)).start()# 关闭客户端对象
     clientSocket.close()if __name__ == '__main__':
     main()

    客户端浏览器页面

    2.显示需要的页面

    import time,multiprocessing,socket,os,re
    
    G_PATH = './html'
    
    def serveHandler(clientSocket,clientAddr):
     recvData = clientSocket.recv(1024).decode('gbk')
     lineFirst = recvData.splitlines()[0]
     strFirst = re.split(r' +',lineFirst)
     fileName = strFirst[1]
    
     filePath = G_PATHif '/'== fileName:
     filePath += './index.html'else:
     filePath += fileNametry:file = Nonefile =open(filePath,'r',encoding='gbk')
     responseBody = file.read()
    
     responseLine = 'HTTP/1.1 200 OK' + os.linesep
     responseHeader = 'Server: ererbai' + os.linesep
     responseHeader += 'Date:%s' % time.ctime() + os.linesep
     except FileNotFoundError:
     responseLine = 'HTTP/1.1 404 NOT FOUND' + os.linesep
     responseHeader = 'Server: ererbai' + os.linesep
     responseHeader += 'Date:%s' % time.ctime() + os.linesep
     responseBody = '很抱歉,服务器中找不到你想要的内容'
     except Exception:
     responseLine = 'HTTP/1.1 500 ERROR' + os.linesep
     responseHeader = 'Server: ererbai' + os.linesep
     responseHeader += 'Date: %s' % time.ctime() + os.linesep
     responseBody = '服务器正在维护中,请稍后再试。'finally:if file!=None and not file.closed:file.close()
    
     senData = (responseLine + responseHeader + os.linesep + responseBody).encode('gbk')
     clientSocket.send(senData)
     clientSocket.close()
    
    
    def main():
     serveSocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
     serveSocket.bind(('',8000))
     serveSocket.listen()while True:
     clientSocket,clientAddr = serveSocket.accept()
     print(clientSocket)
     multiprocessing.Process(target=serveHandler,args=(clientSocket,clientAddr)).start()
     clientSocket.close()if __name__ == '__main__':
     main()

    客户端浏览器首页
    客户端浏览器biye.html页面


    学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入学习交流群
    343599877,我们一起学前端!

    下载本文
    显示全文
    专题