Python实现静态web服务器
2019/01/02 14:22 分类: 技术交流 浏览:52
一、什么是Web服务器
Web服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,可以向浏览器等Web客户端提供文档,也可以放置网站文件,让全世界浏览;可以放置数据文件,让全世界下载。目前最主流的三个Web服务器是Apache Nginx IIS。今天我们用Python来实现一个简单的静态Web服务器。
二、代码实现
from socket import *
from multiprocessing import Process
# 声明一个WebServe的类
class WebServer(object):
"""构造方法"""
def __init__(self, port=8000, max_listen=128):
# 1. 创建套接字
self.tcp_server = socket(AF_INET, SOCK_STREAM)
# 2. 绑定IP和端口
self.tcp_server.bind(("", port))
# 3. 把主动变成被动
self.tcp_server.listen(max_listen)
def request(self, new_socket):
# 5.接收数据
request_data = new_socket.recv(1024)
# 5.1 判断有没有数据
if not request_data:
new_socket.close()
return
print(request_data)
# 6.打印
# 6.1 先把得到数据按行分割成列表
request_lines = request_data.splitlines()
# 6.2 请求行 GET /1.html HTTP/1.1
request_start_line = request_lines[0].decode("utf-8")
# 6.3 取文件名
file_name = request_start_line.split(" ")[1]
# 6.3.1 判断文件名是不是 /
if file_name == "/":
file_name = "/index.html"
# 6.4 拼接上网站根目录常量
file_name = WEB_ROOT + file_name
print(file_name)
try:
# 6.5 打开文件
with open(file_name, "rb") as f:
# 文件内空
html = f.read()
except:
# 7. 返回
# 响应行
response_start_line = b"HTTP/1.1 404 Not found\r\n"
# 响应头
response_headers = b"Content-Type: text/html;charset=UTF-8\r\n"
response_headers += b"Server: YMSD\r\n\r\n"
# 响应体
response_body = "<b>当前网页找不到</b>".encode("utf-8")
#
response_data = response_start_line + response_headers + response_body
new_socket.send(response_data)
else:
# 7. 返回
# 响应行
response_start_line = b"HTTP/1.1 200 OK\r\n"
# 响应头
response_headers = b"Server: YMSD\r\n\r\n"
# 响应体
response_body = html
#
response_data = response_start_line + response_headers + response_body
new_socket.send(response_data)
# 关闭套接字
new_socket.close()
def start(self):
while True:
# 4.等待连接,并创建新的逃接字
new_socket, client_info = self.tcp_server.accept()
# 创建一个进程
p = Process(target=self.request, args=(new_socket,))
# 启动进程
p.start()
# request(new_socket)
# TODO:sad
# 多进程必需关闭new_socket
new_socket.close()
# 声明一个常量用来放网站的根目录
WEB_ROOT = "html"
def main():
# 创建Web对象
web = WebServer(8080)
# 调用对象start方法
web.start()
if __name__ == '__main__':
main()
赞 0