import socket
import threading
import sys
class HttpWebServer():
def __init__(self, port):
# 1.编写一个TCP服务端程序
# 创建一个socket
self.tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置端口可重用
self.tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 绑定地址
self.tcp_server_socket.bind(('', port))
# 设置监听
self.tcp_server_socket.listen(128)
# 获取用户请求路径
def handle_client_request(self, client_socket):
# 获取浏览器的请求信息
client_request_data = client_socket.recv(1024).decode()
print('***********************************1')
print(client_request_data)
print('***********************************2')
# 获取用户请求的资源路径
request_data = client_request_data.split(' ')
if len(request_data) == 1:
client_socket.close()
return
request_data = request_data[1]
if request_data == '/':
request_data = 'index.html'
try:
# 3.读取固定页面数据, 把页面数据组装成HTTP响应报文数据发送给浏览器
with open('./static/' + request_data, 'rb') as f:
file_data = f.read()
except Exception as e:
# 返回404
response_line = 'HTTP/1.1 404 Not Found\r\n'
# 应发头
response_header = 'Server: pwd\r\n'
# 应答体
response_body = "404 Not Found Sorry"
response_data = (response_line + response_header + '\r\n' + response_body).encode()
client_socket.send(response_data)
else:
# 应答行
response_line = 'HTTP/1.1 200 OK\r\n'
# 应发头
response_header = 'Server: pwd\r\n'
# 应答体
response_body = file_data
response_data = (response_line + response_header + '\r\n').encode() + response_body
client_socket.send(response_data)
finally:
client_socket.close()
def start(self):
while True:
# 2.获取浏览器发送的请求报文数据
# 建立链接
client_socket, client_addr = self.tcp_server_socket.accept()
# 创建子线程
sub_thread = threading.Thread(target=self.handle_client_request, args=(client_socket,))
sub_thread.start()
def main():
# 获取命令行终端输入参数
if len(sys.argv) != 2:
print('格式错误,示例为: python XXX.py 9999')
return
if not sys.argv[1].isdigit():
print('格式错误,示例为: python XXX.py 9999')
return
# 创建服务器对象
port = int(sys.argv[1])
my_web_server = HttpWebServer(port)
# 启动服务器
my_web_server.start()
if __name__ == '__main__':
main()
コマンドラインとしてXXX.py実行モードを作成します。例:python XXX.py 9999 9999は、カスタマイズ用のポート番号です。
XXX.pyファイルと同じレベルに静的フォルダーがあり、そこにはいくつかの静的ページが含まれています。
アクセス方法は次のとおりです。http://127.0.0.1:9999デフォルトでindex.htmlインターフェースに戻ります
静的フォルダーはパッケージ化され、次の場所に配置されます。
リンク:https
://pan.baidu.com/s/187w-xaueRMQdsYNPS479Xw抽出コード:yww1