静态web服务器是什么?
-可以为发出请求的浏览器提供静态文档的程序
-平时我们浏览百度新闻数据的时候,每天的新闻数据都会发生变化,那访问的这个页面就是动态的
而我们开发的是静态的,页面的数据不会发生变化
如何搭建python自带的静态web服务器
-搭建python自带的静态web服务器使用
python -m http.server 9090
-m选项说明:
-m 表示运行包里面的模块,执行这个命令的时候,需要进入你自己指定静态文件的目录(html目录)
然后通过浏览器就能访问对应的html文件了,这样一个静态的web服务器就搭建好了
开发自己的静态web服务器
-实现步骤
-编写一个TCP服务端程序
-获取浏览器发送的http请求报文
-读取固定页面数据,把页面数据组装成HTTP响应报文数据发送给浏览器
-HTTP响应报文数据发送完成以后,关闭服务于客户端的套接字
静态web服务器-返回固定页面数据的示例代码
import socket
if __name__ == '__main__':
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
tcp_server_socket.bind(("", 9090))
tcp_server_socket.listen(128)
while True:
new_socket, ip_port = tcp_server_socket.accept()
recv_data = new_socket.recv(4096)
print(recv_data)
with open("static/index.html", "r") as f:
file_data = f.read()
response_line = "HTTP/1.1 200 OK\r\n"
response_header = "Server:PWS/5.0\r\n"
response_body = file_data
response = response_line + response_header + "\r\n" + response_body
response_data = response.encode("utf-8")
new_socket.send(response_data)
new_socket.close()
静态web服务器-返回指定页面数据的示例代码
import socket
def main():
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
tcp_server_socket.bind(("", 9090))
tcp_server_socket.listen(128)
while True:
new_socket, ip_port = tcp_server_socket.accept()
recv_data = new_socket.recv(4096)
if len(recv_data) == 0:
new_socket.close()
return
recv_content = recv_data.decode("utf-8")
request_list = recv_content.split(" ", maxsplit=2)
request_path = request_list[1]
print(request_path)
if request_path == "/":
request_path = "index.html"
with open("static" + request_path, "rb") as f:
file_data = f.read()
response_line = "HTTP/1.1 200 OK\r\n"
response_header = "Server:PWS/5.0\r\n"
response_body = file_data
response = (response_line +
response_header +
"\r\n").encode("utf-8") + response_body
response_data = response
new_socket.send(response_data)
new_socket.close()
if __name__ == '__main__':
main()
静态web服务器-返回404页面数据的示例代码
import socket
import os
def main():
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
tcp_server_socket.bind(("", 9090))
tcp_server_socket.listen(128)
while True:
new_socket, ip_port = tcp_server_socket.accept()
recv_data = new_socket.recv(4096)
if len(recv_data) == 0:
new_socket.close()
return
recv_content = recv_data.decode("utf-8")
request_list = recv_content.split(" ", maxsplit=2)
request_path = request_list[1]
print(request_path)
if request_path == "/":
request_path = "index.html"
try:
with open("static" + request_path, "rb") as f:
file_data = f.read()
except Exception as e:
response_line = "HTTP/1.1 404 Not Found\r\n"
response_header = "Server:PWS/5.0\r\n"
with open("static/error.html", "rb") as f:
file_data = f.read()
response_body = file_data
response = (response_line +
response_header +
"\r\n").encode("utf-8") + response_body
response_data = response
new_socket.send(response_data)
else:
response_line = "HTTP/1.1 200 OK\r\n"
response_header = "Server:PWS/5.0\r\n"
response_body = file_data
response = (response_line +
response_header +
"\r\n").encode("utf-8") + response_body
response_data = response
new_socket.send(response_data)
finally:
new_socket.close()
if __name__ == '__main__':
main()
静态web服务器-多任务版
import socket
import threading
def handler_client_request(new_socket):
recv_data = new_socket.recv(4096)
if len(recv_data) == 0:
new_socket.close()
return
recv_content = recv_data.decode("utf-8")
request_list = recv_content.split(" ", maxsplit=2)
request_path = request_list[1]
print(request_path)
if request_path == "/":
request_path = "index.html"
try:
with open("static" + request_path, "rb") as f:
file_data = f.read()
except Exception as e:
response_line = "HTTP/1.1 404 Not Found\r\n"
response_header = "Server:PWS/5.0\r\n"
with open("static/error.html", "rb") as f:
file_data = f.read()
response_body = file_data
response = (response_line +
response_header +
"\r\n").encode("utf-8") + response_body
response_data = response
new_socket.send(response_data)
else:
response_line = "HTTP/1.1 200 OK\r\n"
response_header = "Server:PWS/5.0\r\n"
response_body = file_data
response = (response_line +
response_header +
"\r\n").encode("utf-8") + response_body
response_data = response
new_socket.send(response_data)
finally:
new_socket.close()
def main():
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
tcp_server_socket.bind(("", 9090))
tcp_server_socket.listen(128)
while True:
new_socket, ip_port = tcp_server_socket.accept()
sub_thread = threading.Thread(target=handler_client_request, args=(new_socket,))
sub_thread.setDaemon(True)
sub_thread.start()
if __name__ == '__main__':
main()
静态web服务器-面向对象开发
-实现步骤:
把提供服务的web服务器抽象成一个类(HTTPWebServer)
提供web服务端的初始化方法,在初始化方法里面创建socket对象
提供一个开启web服务器的方法,让web服务器处理客户端请求操作
import socket
import threading
class HttpWebServer(object):
def __int__(self):
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
tcp_server_socket.bind(("", 9090))
tcp_server_socket.listen(128)
self.tcp_server_socket = tcp_server_socket
@staticmethod
def handler_client_request(new_socket):
recv_data = new_socket.recv(4096)
if len(recv_data) == 0:
new_socket.close()
return
recv_content = recv_data.decode("utf-8")
request_list = recv_content.split(" ", maxsplit=2)
request_path = request_list[1]
print(request_path)
if request_path == "/":
request_path = "index.html"
try:
with open("static" + request_path, "rb") as f:
file_data = f.read()
except Exception as e:
response_line = "HTTP/1.1 404 Not Found\r\n"
response_header = "Server:PWS/5.0\r\n"
with open("static/error.html", "rb") as f:
file_data = f.read()
response_body = file_data
response = (response_line +
response_header +
"\r\n").encode("utf-8") + response_body
response_data = response
new_socket.send(response_data)
else:
response_line = "HTTP/1.1 200 OK\r\n"
response_header = "Server:PWS/5.0\r\n"
response_body = file_data
response = (response_line +
response_header +
"\r\n").encode("utf-8") + response_body
response_data = response
new_socket.send(response_data)
finally:
new_socket.close()
def start(self):
while True:
new_socket, ip_port = self.tcp_server_socket.accept()
sub_thread = threading.Thread(target=self.handler_client_request, args=(new_socket,))
sub_thread.setDaemon(True)
sub_thread.start()
def main():
web_server = HttpWebServer()
web_server.start()
if __name__ == '__main__':
main()
静态web服务器-命令行启动动态绑定端口号
-使用sys模块,sys.argv 获取命令行中的参数
import socket
import threading
import sys
class HttpWebServer(object):
def __init__(self, port):
self.port = port
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
tcp_server_socket.bind(("", self.port))
tcp_server_socket.listen(128)
self.tcp_server_socket = tcp_server_socket
@staticmethod
def handler_client_request(new_socket):
recv_data = new_socket.recv(4096)
if len(recv_data) == 0:
new_socket.close()
return
recv_content = recv_data.decode("utf-8")
request_list = recv_content.split(" ", maxsplit=2)
request_path = request_list[1]
print(request_path)
if request_path == "/":
request_path = "static/index.html"
try:
with open("static" + request_path, "rb") as f:
file_data = f.read()
except Exception as e:
response_line = "HTTP/1.1 404 Not Found\r\n"
response_header = "Server:PWS/5.0\r\n"
with open("static/error.html", "rb") as f:
file_data = f.read()
response_body = file_data
response = (response_line +
response_header +
"\r\n").encode("utf-8") + response_body
response_data = response
new_socket.send(response_data)
else:
response_line = "HTTP/1.1 200 OK\r\n"
response_header = "Server:PWS/5.0\r\n"
response_body = file_data
response = (response_line +
response_header +
"\r\n").encode("utf-8") + response_body
response_data = response
new_socket.send(response_data)
finally:
new_socket.close()
def start(self):
while True:
new_socket, ip_port = self.tcp_server_socket.accept()
sub_thread = threading.Thread(target=self.handler_client_request, args=(new_socket,))
sub_thread.setDaemon(True)
sub_thread.start()
def main():
params = sys.argv
if len(params) != 2:
print("执行的命令格式如下:python xxx.py 9090")
return
if not params[1].isdigit():
print("执行的命令格式如下:python xxx.py 9090")
return
port = int(params[1])
web_server = HttpWebServer(port)
web_server.start()
if __name__ == '__main__':
main()