# 读取controlled.ini文件 import configparser from loguru import logger logger.add('controlled.log', rotation='1 MB', retention='7 days', level='DEBUG') config = configparser.ConfigParser() config.read('controlled.ini') listen_ip = config.get('connection', 'listen_ip') listen_port = int(config.get('connection', 'listen_port')) password = config.get('connection', 'password') # 模拟断开和等待连接状态 logger.info('断开状态') logger.info('等待连接状态') import socket import selectors # 创建一个默认的选择器对象 sel = selectors.DefaultSelector() # 创建一个TCP套接字 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 设置套接字选项,允许地址重用 server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 绑定到指定的IP地址和端口 server_socket.bind((listen_ip, listen_port)) # 开始监听,允许的最大连接数为10 server_socket.listen(10) logger.info(f'正在监听 {listen_ip}:{listen_port}') # 将套接字设置为非阻塞模式 server_socket.setblocking(False) # 注册服务器套接字到选择器,监听读事件 sel.register(server_socket, selectors.EVENT_READ, data=None) while True: # 等待事件发生 events = sel.select(timeout=None) for key, mask in events: if key.data is None: # 如果是服务器套接字事件,意味着有新的连接 conn, addr = server_socket.accept() logger.info(f'接受来自 {addr} 的连接') conn.setblocking(False) # 注册新连接的套接字到选择器,监听读事件 data = {'addr': addr} sel.register(conn, selectors.EVENT_READ, data=data) else: # 如果是客户端套接字事件,意味着有数据可读 conn = key.fileobj data = key.data try: # 接收数据 recv_data = conn.recv(1024) if recv_data: logger.debug(f'从 {data['addr']} 接收数据: {recv_data.decode()}') else: # 如果没有数据,意味着客户端关闭了连接 logger.info(f'关闭来自 {data['addr']} 的连接') sel.unregister(conn) conn.close() except Exception as e: # 处理异常,关闭连接 logger.error(f'处理来自 {data['addr']} 的连接时出错: {e}') sel.unregister(conn) conn.close()