http协议简介
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于万维网(WWW:World Wide Web )服务器与本地浏览器之间传输超文本的传送协议。
HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。HTTP协议工作于客户端-服务端架构为上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。Web服务器根据接收到的请求后,向客户端发送响应信息。
# coding:utf-8
import socket
from multiprocessing import Process
def handle_client(client_socket):
"""
处理客户端请求
"""
while 1:
request_data = client_socket.recv(1024)
print(client_socket)
print("request data:", request_data)
if request_data.decode() == '':
# client_socket.close()
return
try:
request_line, body = request_data.decode().split('\r\n', 1)
header_list = request_line.split(' ')
method = header_list[0].upper()
url = header_list[1]
print('request_line:',request_line)
print('body',body)
print('header_list',header_list)
print('url',url)
# 获得请求参数
if method == 'POST':
request_data = {}
request_body = body.split('\r\n\r\n', 1)[1]
parameters = request_body.split('\n') # 每一行是一个字段
parameters = request_body.split('&') # 每一行是一个字段
for i in parameters:
key, val = i.split('=',1)
request_data[key] = val
print("post request data body:",request_data)
if method == 'GET':
# 获取get参数
if url.find('?') != -1:
request_data = {}
req = url.split('?', 1)[1]
file_name = url.split('?', 1)[0]
parameters = req.split('&')
for i in parameters:
key, val = i.split('=', 1)
request_data[key] = val
print("get request data url:", request_data)
# 构造响应数据
filepath = './myhtml1.html'
f = open(filepath, 'rb') # 打开二进制文件
htmlfile = f.read()
f.close()
response_start_line = "HTTP/1.1 200 OK\r\n"
response_headers = "Server: My server\r\n"
response_body = htmlfile
response = response_start_line + response_headers + "\r\n"
# 向客户端返回响应数据
client_socket.send(bytes(response, "utf-8"))
client_socket.send(bytes(response_body))
finally:
pass
# 关闭客户端连接
# client_socket.close()
# return
if __name__ == "__main__":
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(("192.168.16.222", 8000))
server_socket.listen(128)
while True:
client_socket, client_address = server_socket.accept()
print("[%s, %s]用户连接上了" % (client_socket,client_address))
handle_client_process = Process(target=handle_client, args=(client_socket,))
handle_client_process.start()
print("[%s, %s]用户连接上了2" % (client_socket, client_address))
client_socket.close()
print("[%s, %s]用户连接上了3" % (client_socket, client_address))