一、Web服务器代码
'''
* 功能:Web浏览器访问 Web服务器,获取 index.html 文件
* 目的:1、当一个客户(浏览器)联系时创建一个套接字
* 2、从这个连接接收 HTTP 请求
* 3、解释该请求以确定所请求的特定文件
* 4、从服务器的文件系统获得请求的文件
* 5、创建一个由请求文件组成的 HTTP 响应的报文,报文前面有首部行
* 6、经TCP连接向请求的浏览器发送响应。如果请求文件不在服务器中,返回 “404 Not Found”
'''
from socket import * #引用套接字
import os #引用文件管理
serverHost = '127.0.0.1' #Web服务器IP地址
serverPort = 12000 #服务端的端口号
'''
* 函数功能:解释 HTTP 请求报文
* 返回值: 请求的文件名
'''
def HTTPExplain(Message):
Data = Message.decode() #解码报文
print(Data) #打印报文
Lines = Data.split("\r\n") #通过指定分隔符对字符串切片
Url = Lines[0].split(" ") #得到 URL [GET /index.html HTTP/1.1]
FileName = Url[1].split('/')[1] #得到 ['index.html']
print(FileName) #打印请求文件名
return FileName
'''
* 函数功能:构造 HTTP 响应报文
* 返回值: 响应报文
'''
def GetFile(FileName):
path = "WebServer\\" + FileName #文件路径
if FileName in os.listdir("WebServer"): #判断文件是否存在
with open(path,'r',encoding="utf-8") as fp: #打开文件
data = fp.read() #读取文件
HttpResponse = "HTTP/1.1 200 OK\r\n\r\n" + data #请求文件携带请求成功首部
else:
HttpResponse = "HTTP/1.1 404 \r\n\r\n<h1>404 Not Found</h1>" #请求失败报文
return HttpResponse.encode()
#握手套接字
serverSocket = socket(AF_INET,SOCK_STREAM) #创建一个握手套接字
serverSocket.bind((serverHost,serverPort)) #绑定地址(host,port)到握手套接字
serverSocket.listen(1) #请求连接的最大数
print('The server is ready,Port is ',serverPort) #提示服务器准备就绪
#创建连接套接字
connectSocket,addr = serverSocket.accept() #被动接受TCP客户端连接,创建连接套接字
Message = connectSocket.recv(1024) #接收TCP数据,数据以字符串形式返回
FileName = HTTPExplain(Message) #调用函数获取请求文件
#连接套接字
ResponseMessage = GetFile(FileName) #调用函数构造响应报文
connectSocket.sendall(ResponseMessage) #完全发送响应报文
connectSocket.close() #关闭连接套接字
二、请求文件
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>标题使用</title>
</head>
<body>
<h1>一级标题</h1>
<h2>二级标题</h2>
<h3>三级标题</h3>
<h4>四级标题</h4>
<h5>五级标题</h5>
<h6>六级标题</h6>
</body>
</html>
三、文件路径
我把服务器文件 WebServer.py 和请求文件 index.html 放在了 WebServer 文件夹里,下列两行代码就是确定路径,然后判断文件是否存在。
path = "WebServer\\" + FileName #文件路径
if FileName in os.listdir("WebServer"): #判断文件是否存在
注意:path = "WebServer\\" + FileName #文件路径 这一句为了兼容 windows 系统,在 Linux 系统中不用这一句,可以直接寻找文件
四、Web浏览器访问
如图:输入127.0.0.1:12000/index.html
Host:127.0.0.1
Port:12000
请求文件:index.htnl