核心还是使用Python的socket实现的,socket的具体用法前面文章有写,这里不写太多注释。
1.本地搭建python静态web服务器
在资源目录打开命令终端,输入命令:python -m http.server [端口号],端口号不写默认8000即可
然后在浏览器输入localhost:8000/资源路径即可访问你想访问的页面
2.返回固定数据的静态web服务器
'''
返回固定数据的静态web服务器
'''
# 导入模块
import socket
# 创建socket对象
static_web_server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
static_web_server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True) # 设置端口复用
static_web_server_socket.bind(('',7777))
static_web_server_socket.listen(128)
# 接收请求()
while True:
client,ip_port=static_web_server_socket.accept()
print(f'客户端{ip_port[0]}使用端口{ip_port[1]}连接成功...')
# 接收客户端的请求信息
request_data=client.recv(1024).decode('gbk')
print(request_data)
# 读取资源内容,无论客户端访问的哪个文件,返回的都是这个文件
with open('static/index.html','rb') as file:
file_content=file.read() # 作为响应体
# 响应行
response_line='HTTP/1.1 200 OK\r\n'
# 响应头
response_header='Server: Tengine\r\nContent-Type: text/html; charset=UTF-8\r\nConnection: keep-alive\r\n'
# 拼接相应报文(响应行+响应头+空行+响应体),需是二进制数据
response_data=(response_line+response_header+'\r\n').encode('utf-8')+file_content
# 发送报文
client.send(response_data)
# 关闭客户端连接
client.close()
print(f'客户端{ip_port[0]}关闭连接')
# 关闭服务器
static_web_server_socket.close()
print('Stop!')
3.返回指定数据的静态web服务器
'''
返回指定数据的静态web服务器
'''
import socket
def server_start(port):
web_server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
web_server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)
web_server.bind(('',port))
web_server.listen(128)
while True:
client,ip_port=web_server.accept()
print(f'客户端{ip_port[0]}使用{ip_port[1]}端口连接成功')
request_info=client.recv(1024).decode('gbk')
if len(request_info)==0:
client.close()
continue
# print(request_info)
resource_path=request_info.split()[1]
print(f'{ip_port[0]}请求的资源路径是:{resource_path}')
if resource_path=='/':
resource_path='index.html'
try:
with open(f'static/{resource_path}','rb') as f:
response_body=f.read()
except Exception as e:
print('请求的文件不存在,请检查',e)
with open('static/404.html','rb') as f:
response_body=f.read()
response_line = 'HTTP/1.1 404 NOT FOUND\r\n'
else:
print('资源请求成功!')
response_line='HTTP/1.1 200 OK'
finally:
response_header='Server:PSWS1.0\r\nContent-Type:text/html;Charset=UTF-8\r\n'
response_data=(response_line+response_header+'\r\n').encode()+response_body
client.send(response_data)
client.close()
if __name__ == '__main__':
server_start(7777)
print('Stop')
4.多任务版静态web服务器
'''
多任务版静态web服务器
'''
import socket
import multiprocessing
import threading
def server_start(port):
web_server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
web_server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)
web_server.bind(('',port))
web_server.listen(128)
while True:
client,ip_port=web_server.accept()
# 多进程实现多任务
# t=multiprocessing.Process(target=transit,args=(client,ip_port))
# t.daemon=True
# 多线程实现多任务
t=threading.Thread(target=transit,args=(client,ip_port))
t.setDaemon(True)
t.start()
# 多线程不写,但是多进程必须写
# client.close()
# 执行不到,不写也行
web_server.close()
def transit(client,ip_port):
print(f'客户端{ip_port[0]}使用{ip_port[1]}端口连接成功')
request_info = client.recv(1024).decode('gbk')
if len(request_info) == 0:
print(f'{ip_port[0]}关闭了连接')
client.close()
return
# print(request_info)
resource_path = request_info.split()[1]
print(f'{ip_port[0]}请求的资源路径是:{resource_path}')
if resource_path == '/':
resource_path = 'index.html'
try:
with open(f'static/{resource_path}', 'rb') as f:
response_body = f.read()
except Exception as e:
print('请求的文件不存在,请检查', e)
with open('static/404.html', 'rb') as f:
response_body = f.read()
response_line = 'HTTP/1.1 404 NOT FOUND\r\n'
else:
print('资源请求成功!')
response_line = 'HTTP/1.1 200 OK'
finally:
response_header = 'Server:PSWS1.0\r\nContent-Type:text/html;Charset=UTF-8\r\n'
response_data = (response_line + response_header + '\r\n').encode() + response_body
client.send(response_data)
client.close()
if __name__ == '__main__':
server_start(7777)
print('Stop')
5.多任务版静态web服务器(面向对象)
'''
多任务版静态web服务器(面向对象)
'''
import socket
# import multiprocessing
import threading
class WebServer(object):
def __init__(self,port):
self.web_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.web_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
self.web_server.bind(('', port))
self.web_server.listen(128)
def server_start(self):
while True:
client,ip_port=self.web_server.accept()
# 多进程实现多任务
# t=multiprocessing.Process(target=self.transit,args=(client,ip_port))
# t.daemon=True
# 多线程实现多任务
t=threading.Thread(target=self.transit,args=(client,ip_port))
t.setDaemon(True)
t.start()
# 多线程不写,但是多进程必须写
# client.close()
# 执行不到,不写也行
self.web_server.close()
def transit(self,client,ip_port):
print(f'客户端{ip_port[0]}使用{ip_port[1]}端口连接成功')
request_info = client.recv(1024).decode('gbk')
if len(request_info) == 0:
print(f'{ip_port[0]}关闭了连接')
client.close()
return
# print(request_info)
resource_path = request_info.split()[1]
print(f'{ip_port[0]}请求的资源路径是:{resource_path}')
if resource_path == '/':
resource_path = 'index.html'
try:
with open(f'static/{resource_path}', 'rb') as f:
response_body = f.read()
except Exception as e:
print('请求的文件不存在,请检查', e)
with open('static/error.html', 'rb') as f:
response_body = f.read()
response_line = 'HTTP/1.1 404 NOT FOUND\r\n'
else:
print('资源请求成功!')
response_line = 'HTTP/1.1 200 OK'
finally:
response_header = 'Server:PSWS1.0\r\nContent-Type:text/html;Charset=UTF-8\r\n'
response_data = (response_line + response_header + '\r\n').encode() + response_body
client.send(response_data)
client.close()
if __name__ == '__main__':
WebServer(7777).server_start()
6.多任务版静态web服务器(命令行传参)
格式:python(或python3) 文件名.py 参数
'''
多任务版静态web服务器(命令行传参)
python(或python3) 文件名.py 参数
'''
import socket
# import multiprocessing
import threading
import sys
class WebServer(object):
def __init__(self,port):
self.web_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.web_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
self.web_server.bind(('', port))
self.web_server.listen(128)
def server_start(self):
while True:
client,ip_port=self.web_server.accept()
# 多进程实现多任务
# t=multiprocessing.Process(target=self.transit,args=(client,ip_port))
# t.daemon=True
# 多线程实现多任务
t=threading.Thread(target=self.transit,args=(client,ip_port))
t.setDaemon(True)
t.start()
# 多线程不写,但是多进程必须写
# client.close()
# 执行不到,不写也行
self.web_server.close()
def transit(self,client,ip_port):
print(f'客户端{ip_port[0]}使用{ip_port[1]}端口连接成功')
request_info = client.recv(1024).decode('gbk')
if len(request_info) == 0:
print(f'{ip_port[0]}关闭了连接')
client.close()
return
# print(request_info)
resource_path = request_info.split()[1]
print(f'{ip_port[0]}请求的资源路径是:{resource_path}')
if resource_path == '/':
resource_path = 'index.html'
try:
with open(f'static/{resource_path}', 'rb') as f:
response_body = f.read()
except Exception as e:
print('请求的文件不存在,请检查', e)
with open('static/404.html', 'rb') as f:
response_body = f.read()
response_line = 'HTTP/1.1 404 NOT FOUND\r\n'
else:
print('资源请求成功!')
response_line = 'HTTP/1.1 200 OK'
finally:
response_header = 'Server:PSWS1.0\r\nContent-Type:text/html;Charset=UTF-8\r\n'
response_data = (response_line + response_header + '\r\n').encode() + response_body
client.send(response_data)
client.close()
if __name__ == '__main__':
if len(sys.argv)!=2:
print('请输入python3 文件名.py 端口号')
else:
port=sys.argv[1]
if port.isdigit():
WebServer(int(port)).server_start()
else:
print('端口号必须为数字')