http协议

74 阅读1分钟

一.http协议是一种基于tcp网络传输规范

request: 请求头:请求方式 http/1.1,host等

请求数据:

response回送:

header头:包含浏览器的一些信息,必须有类似这个:http/1.1:200 ok

body:回应的数据

header 和boday区分:通过空行来隔开

image.png

实例1:

写一个tcp服务器然后用网页访问服务器返回一个固定的东西:

#coding:utf-8
'''实现一个tcp服务器,然后用网页访问'''
import socket
def serve_celient(new_sock):
    #接收数据
    recv_data = new_sock.recv(1024)
    print(recv_data)
    #回送数据
    respo_data = 'http/1.1 200 OK\r\n'
    respo_data += '\r\n'
    respo_data += '<h1>hahahahah</h1>'
    new_sock.send(respo_data.encode('utf-8'))
    #关闭套接字
    new_sock.close()


def main():
    #1.创建套接字
    tcp_sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    #2.绑定
    tcp_sock.bind(("",7080))
    #2.监听
    tcp_sock.listen(128)
    #5.等待接收数据
    while True:
        new_soc,celient_addr = tcp_sock.accept()
        print(celient_addr)
        serve_celient(new_soc)
        #服务客户端




if __name__ == '__main__':
    main()

三次握手:(双方指客户端和服务器端) 双方建立连接的

image.png 四次挥手: 双方释放资源的

image.png

案例2: 在案例1的基础上根据用户的需求来返回不同的界面,

#coding:utf-8
'''实现一个tcp服务器,然后用网页访问'''
import socket
import re
import os
def serve_celient(new_sock):
    #为这个酷虎返回数据
    recv_data = new_sock.recv(1024)
    print(recv_data.decode('utf-8'))
    request = recv_data.decode('utf-8').splitlines()
    file_name = re.search(r'[^/]+/([^ ]*)',request[0])
    print(file_name)
    if file_name:
        print("*"*50,file_name.group(1))
        with open(os.path.join("html",file_name.group(1)),"r") as f:
            html_content = f.read()
    #回送数据
    respo_data = 'http/1.1 200 OK\r\n'
    respo_data += '\r\n'
    #respo_data += '<h1>hahahahah</h1>'
    new_sock.send(respo_data.encode('utf-8'))
    new_sock.send(html_content.encode('gbk'))
    #关闭套接字
    new_sock.close()


def main():
    #1.创建套接字
    tcp_sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    #2.绑定
    tcp_sock.bind(("",7080))
    #2.监听
    tcp_sock.listen(128)
    #5.等待接收数据
    while True:
        new_soc,celient_addr = tcp_sock.accept()
        print(celient_addr)
        serve_celient(new_soc)
        #服务客户端




if __name__ == '__main__':
    main()