import socket
import threading
# 创建服务器类
class HTTPWebServer(object):
def __init__(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((‘‘, 9998)) # 绑定端口
tcp_server_socket.listen(5) # 设置监听
self.tcp_server_socket = tcp_server_socket # 设置self属性
# 设置开始方法
def start(self):
while True:
conn_socket, ip_port = self.tcp_server_socket.accept() # 接收浏览器客户端套接字数据
sub_thread = threading.Thread(target=self.handle_client_request, args=(conn_socket,)) # 创建线程
sub_thread.setDaemon(True) # 守护主线程
sub_thread.start() # 开始线程
# 设置静态方法
@staticmethod
def handle_client_request(conn_socket):
recv_client_data = conn_socket.recv(4096) # 接收套接字对象
if len(recv_client_data) > 0: # 判断是否有数据
recv_client_content = recv_client_data.decode(‘utf-8‘) # 数据转码
request_path = recv_client_content.split(‘ ‘, maxsplit=2)[1] # 分割响应行
if request_path == ‘/‘: # 如果返回为‘/‘则连接到主页面
request_path = ‘/index.html‘
try:
with open(‘web‘ + request_path, ‘rb‘) as f: # 查询要访问的地址是否存在
file_data = f.read() # 存在则读取数据
except Exception as e: # 不存在则接收错误
response_line = ‘HTTP/1.1 404 Not Found\r\n‘ # 响应行
response_head = ‘Server:PWB1.0\r\n‘ # 响应头
with open(‘web/error.html‘, ‘rb‘) as f: # 打开错误时连接的地址
file_data = f.read() # 读取数据
response_body = file_data # 响应体
response_data = (response_line + response_head + ‘\r\n‘).encode(‘utf-8‘) + response_body # 组合成响应报文
conn_socket.send(response_data) # 返回数据
else: # 不报错时
response_line = ‘HTTP/1.1 200 ok\r\n‘ # 响应行
response_head = ‘Server:PWB1.0\r\n‘ # 响应头
response_body = file_data # 响应体
response_data = (response_line + response_head + ‘\r\n‘).encode(‘utf-8‘) + response_body # 组合成响应报文
conn_socket.send(response_data) # 返回数据
if __name__ == ‘__main__‘:
web_server = HTTPWebServer()
# 启动web服务器
web_server.start()
原文:https://www.cnblogs.com/study-bigdata/p/15139610.html