python中的HTTP传输

HTTP协议 (超文本传输协议)
用途 : 网页获取,数据的传输
特点
应用层协议,传输层使用tcp传输
简单,灵活,很多语言都有HTTP专门接口
无状态,协议不记录传输内容
http1.1 支持持久连接,丰富了请求类型
网页请求过程
1.客户端(浏览器)通过tcp传输,发送http请求给服务端
2.服务端接收到http请求后进行解析
3.服务端处理请求内容,组织响应内容
4.服务端将响应内容以http响应格式发送给浏览器
5.浏览器接收到响应内容,解析展示
HTTP请求(request)
请求行 : 具体的请求类别和请求内容
GET / HTTP/1.1
请求类别 / 请求内容 / 协议版本

请求类别:每个请求类别表示要做不同的事情
GET : 获取网络资源
POST :提交一定的信息,得到反馈
HEAD : 只获取网络资源的响应头
PUT : 更新服务器资源
DELETE : 删除服务器资源
CONNECT
TRACE : 测试
OPTIONS : 获取服务器性能信息
请求头:对请求的进一步解释和描述
Accept-Encoding: gzip
空行
请求体: 请求参数或者提交内容

http响应(response)
响应格式:响应行,响应头,空行,响应体
响应行 : 反馈基本的响应情况
HTTP/1.1 200
版本信息 响应码
OK
附加信息
响应码 :
1xx 提示信息,表示请求被接收
2xx 响应成功
3xx 响应需要进一步操作,重定向
4xx 客户端错误
5xx 服务器错误
响应头:对响应内容的描述
Content-Type: text/html
响应体:响应的主体内容信息

"""
获取http请求
回复响应
"""

from socket import *

# http使用tcp协议
s = socket()
s.bind(('0.0.0.0',8001))
s.listen(3)             # tcp server三步:创建、绑定、监听

c,addr = s.accept() # 链接了浏览器
print("Connect from",addr)# 指出哪个地址发送来了消息
request = c.recv(4096).decode() # 接受请求
print(request)

response="""HTTP/1.1 200 OK
Content-Type:text/html;charset=UTF-8

人生苦短,我用Python。
"""

# response="""HTTP/1.1 404 Not Found
# Content-Type:text/html;charset=UTF-8
#
# Sorry...
# """
c.send(response.encode()) # 发送响应

c.close()
s.close()

  服务端练习:

"""
编写一个服务端http程序,在客户端发起request请求时
将网页按照http响应格式发送给浏览器展示

温馨提示: 网页的内容是响应体,注意协调响应格式

         对请求做一定的解析判断,如果请求内容是(请求内容是网址斜杠后边的东西)
         / 则发送这个网页
         如果是其他的则 用 404 进行响应
"""

from socket import *

# 处理具体请求
def handle(connfd):
    # http请求
    request = connfd.recv(4096).decode()    # 接收请求
    if not request: # 请求为空就直接返回
        return
    # 从http请求中提取请求内容
    request_line = request.split('\n')[0] # 用换行符做为分隔,来提取第一行
    info = request_line.split(' ')[1] # 用空格来提取请求

    # 根据请求内容组织响应
    if info == '/':
        response = "HTTP/1.1 200 OK\r\n"    # 响应行
        response += "Content-Type:text/html\r\n" # 响应头
        response += '\r\n'                     # 空行
        with open('index.html') as f:
            response += f.read()             # 响应体
    else:
        response = "HTTP/1.1 404 Not Found\r\n"
        response += "Content-Type:text/html\r\n"
        response += '\r\n'
        response += 'Sorry.....' # 响应体的变化
    # 将响应发送给浏览器
    connfd.send(response.encode()) # 发送走

# 搭建tcp网络
def main(addr):
    sockfd = socket() # 创建套接字
    sockfd.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) # 设置端口刷新释放
    sockfd.bind(addr) # 绑定
    sockfd.listen(3) # 监听
    while True:
        try:
            # 等浏览器链接
            connfd,addr = sockfd.accept()
        except KeyboardInterrupt:
            break
        handle(connfd) # 处理浏览器请求

    sockfd.close() # 关闭套接字

if __name__ == '__main__':
    main(('0.0.0.0',8000))

  

猜你喜欢

转载自www.cnblogs.com/ngbjng/p/11994336.html