命令行模式下,TCP服务器端,返回静态页面
port不传参则可以直接执行
sys.argv 是命令行输入后的内容列表[xxx.py, www]
python xxx.py www
# 导入包
import socket
import threading
import sys
# 面向对象:
# 抽象对象
# 名字 Httpwebserver
# 属性 服务器socket
# 方法 初始化方法 __init__()
# 启动方法 start()
class Httpwebserver(object):
def __init__(self, port=9090):
# 创套接字
tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置端口复用
tcp_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 绑定端口号
tcp_server.bind(("", port))
# 设置监听模式
tcp_server.listen(128)
self.tcp_server = tcp_server
def start(self):
while 1:
# 等待连接
new_client, client_id = self.tcp_server.accept()
print("新的客户端连接:", client_id)
# handle(new_client, client_id) # 函数模式
# 创建子线程
handle_th = threading.Thread(target=self.handle, args=(new_client, client_id))
handle_th.daemon = True
handle_th.start()
@staticmethod
def handle(new_client, client_id):
# 接收消息
data = new_client.recv(4096)
# 空消息则打印关闭信息,continue
if len(data) == 0:
print("浏览器已断开", client_id)
new_client.close()
return
# 请求头拆分
msg = data.decode()
print(msg)
msg_list = msg.split(" ", 2)
file_name = msg_list[1]
if file_name == "/":
file_name = "/index.html"
try:
# 打开对应的网页内容
with open("static" + file_name, "rb") as file:
file_data = file.read()
except Exception:
# 没有则报错
print("没有找到相应的内容,向浏览器报错。")
with open("static/error.html", "rb") as file:
file_data = file.read()
# 响应行
response_line = "HTTP/1.1 404 Not Found\r\n"
# 响应头
response_head = "Server: PSW1.0\r\n"
# 响应体
response_body = file_data
else:
# 响应行
response_line = "HTTP/1.1 200 ok\r\n"
# 响应头
response_head = "Server: PSW1.0\r\n"
# 响应体
response_body = file_data
# finally合成响应内容,关闭套接字
finally:
recv_data = (response_line + response_head + "\r\n").encode("UTF-8") + response_body
new_client.send(recv_data)
new_client.close()
if __name__ == '__main__':
if len(sys.argv) != 2:
web = Httpwebserver()
else:
if not sys.argv[1].isdigit():
print("端口号应该是整数")
exit()
port = int(sys.argv[1])
web = Httpwebserver(port)
web.start()