tcp应用之http传输
http协议
- 超文本传输协议,是一个应用层协议
- 网页数据的传输
- 数据传输方法
http协议特点
- 应用层协议,传输层使用tcp服务
- 简单,灵活,多种语言都有http相关操作接口
- 无状态的协议,即不记录用户传输的信息
- http1.1 支持持久连接
http交互过程
一端通过http请求的格式发送具体请求内容,另一端接收http请求,按照协议格式解析。获取真实请求后按照http协议响应格式组织回复内容,回发给请求方,完成一次数据交互。
http请求
请求格式
- 请求行
具体的请求类别和请求内容
# 格式: GET / HTTP/1.1
# 请求类别 请求内容 协议版本
# 请求类别:表示请求的种类
# GET 获取网络资源
# POST 提交一定的附加信息,得到返回结果
# HEAD 获取响应头
# PUT 更新服务器资源
# DELETE 删除服务器资源
# CONNECT (预留)
# TRACE 用于测试
# OPTIONS 获取服务器性能信息
- 请求头
对请求内容的具体描述信息,每一项占一行,以键值对的形式展现
# :authority: www.jianshu.com
# :method: PUT
# :path: /author/notes/44522113
# :scheme: https
# accept: application/json
# accept-encoding: gzip, deflate, br
# accept-language: zh-CN,zh;q=0.9,en;q=0.8
# content-length: 1371
# content-type: application/json; charset=UTF-8
- 空行
- 请求体
请求参数或者是提交内容
响应格式
- 响应行
反馈响应的情况
/*
格式: HTTP/1.1 200 OK
协议版本 响应码 附加信息
响应码:响应的具体情况
1xx : 提示信息,表示请求成功
2xx : 响应成功
3xx : 响应需要重定向
4xx : 客户端错误
5xx : 服务端错误
常见响应码 :
200 成功
404 请求内容不存在
401 没有访问权限
500 服务器发生未知错误
503 暂时无法执行
*/
- 响应头
对应内容的具体描述
/*
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/html
Date: Thu, 06 Sep 2018 09:11:18 GMT
*/
- 空行
- 响应体
返回给请求端的具体内容
示例
# http_server.py
from socket import *
def handleClient(connfd):
request = connfd.recv(4096)
# print(request)
requestlines = request.splitlines()
for line in requestlines:
print(line)
try:
f = open('index.html')
except IOError:
response = "HTTP/1.1 404 not found\r\n"
response += "\r\n" #空行
response += "====Sorry not found====="
else:
response = "HTTP/1.1 200 OK\r\n"
response += "\r\n" #空行
response += f.read()
finally:
connfd.send(response.encode())
def main():
s = socket()
s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
s.bind(('127.0.0.1',8888))
s.listen(5)
print("Listen to the port 8888:")
while True:
connfd,addr = s.accept()
handleClient(connfd)
connfd.close()
if __name__ == "__main__":
main()
网友评论