网络编程–http请求、响应网页
http协议是一个tcp应用层的超文本传输协议,主要是对网页的传输和数据的传输
http传输过程:
一端通过http请求的格式发送具体请求内容,另一端接收http请求,按照协议 格式进行解析,获取真实请求后按照http协议响应格式 组织回复内容,回法给请求方,完成一次数据交互。
http请求格式:
请求行:具体的请求类别和请求内容
请求行的格式: GET / HTTP/1.1
对应的解释: 请求类型 请求内容 http协议版本
请求类型:表示请求的种类
GET: 获取网络资源
POST: 提交一定的附加信息,得到返回结果
...
请求头:对请求内容的具体描述信息
空行:格式要求
请求体:请求参数或提交内容
http响应格式:
响应行:反馈 响应的情况
响应行的格式: HTTP/1.1 200 OK
对应的解释: http协议版本 响应码 附加信息
响应吗:响应的具体情况
1xx:提示信息,表示请求成功
2xx:响应成功
3xx:响应需要重定向
4xx:客户端错误
5xx:服务端错误
常见的响应码:
200:成功
401:没有访问权限
404:请求内容不存在
500:服务器发生未知错误
503:暂时无法执行
...
响应头:对响应内容的具体描述信息
空行:格式要求
响应体:返回给请求你端的具体内容
使用http协议写一个简单的请求与响应的交互传输数据
如先有一个index.html网页
一会使用ip和端口号显示这个页面
http代码该怎么写:
- 创建套接字
- 绑定服务器地址并设置监听
- 等待http的请求
- 处理http请求,并作出响应
- 关闭套接字
请求、响应怎么写:
- 接收浏览器的请求
- 作出响应,请求是否成功
- 返回响应内容
# http_server.py
from socket import *
# 2. 处理浏览器请求的函数
def http_handle(connfd):
# 接收请求
request = connfd.recv(4096)
# 作出响应
try:
f = open('index.html', 'r')
except IOError: # 打开文件失败(请求失败)
response = 'HTTP/1.1 404 not fount\r\n'
response += '\r\n'
response += '---------not fount------------'
else: # 打开文件成功(请求成功)
response = 'HTTP/1.1 200 OK\r\n'
response += '\r\n'
response += f.read()
finally: # 无论成功还是失败都要执行的语句
# 将响应信息发送给浏览器
connfd.send(response.encode())
f.close() # 关闭文件
# 1. 写一个主函数,在里边完成基本操作
def main():
# 创建套接字
sockfd = socket(AF_INET, SOCK_STREAM)
# 设置套接字ip格式
sockfd.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
# 绑定服务器地址,设置监听
http_server_addr = ('0.0.0.0', 8000)
sockfd.bind(http_server_addr)
sockfd.listen(3)
# 处理请求
while True:
connfd, addr = sockfd.accept()
# 调用函数, 让其处理请求,考虑传什么参数
http_handle(connfd)
# 关闭套接字
connfd.close()
sockfd.close()
在这里就固定了页面,后面会讲不固定的页面
请求成功如下:
请求失败(先让index.html在该路径下消失一会)如下:
刚才说的这样做我们只能固定的打开index.html这个文件,而我们要输入别的文件的话就都会是失败的结局,我们可以做一个判断,先看图片:
我们看到了,GET后边后边跟的要么是斜杠,要么是一个文件的路径,其实斜杠就是跟目录,会自动匹配index.html,那么怎么匹配到这个路径呢?
# 接收了请求以后进行处理一下
request_lines = request.splitlines()
reshtml = str(request_lines[0]).split(' ')[1]
if reshtml[-5:] == '.html' or reshtml == '/':
print(reshtml)
我们打印了reshtml,看看会打印什么
/index.html
/
第一个是输入文件名称,第二个是不输入直接发出请求
我们可以根据这个做判断了,判断就不说了
本节完!