import socket import threading import select TARGET_HOST = 'superstar.geelytravel.com' TARGET_PORT = 443 LISTEN_PORT = 8080 b_device_socket = None client_socket = None def handle_b_device(conn): """处理B设备的连接""" global b_device_socket b_device_socket = conn print(f"B设备已连接: {conn.getpeername()}") try: while True: data = conn.recv(4096) if not data: print("B设备断开连接") b_device_socket = None break if client_socket: try: client_socket.send(data) except: pass except Exception as e: print(f"B设备连接出错: {e}") b_device_socket = None def handle_client(conn): """处理用户请求""" global client_socket client_socket = conn print(f"用户连接: {conn.getpeername()}") try: while True: data = conn.recv(4096) if not data: print("用户断开连接") client_socket = None break if b_device_socket: try: b_device_socket.send(data) except: conn.send(b"HTTP/1.1 503 Service Unavailable\r\n\r\nDevice B not connected") break else: conn.send(b"HTTP/1.1 503 Service Unavailable\r\n\r\nDevice B not connected") break except Exception as e: print(f"用户连接出错: {e}") client_socket = None def run_server(): server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server.bind(('0.0.0.0', LISTEN_PORT)) server.listen(5) print(f"A设备代理服务器已启动,监听端口 {LISTEN_PORT}") print(f"等待B设备连接和用户请求...") while True: conn, addr = server.accept() print(f"新连接: {addr}") # 判断是B设备还是用户(简单判断:先连接的是B设备) if b_device_socket is None: # 第一个连接作为B设备 t = threading.Thread(target=handle_b_device, args=(conn,)) t.start() else: # 后续连接作为用户 t = threading.Thread(target=handle_client, args=(conn,)) t.start() if __name__ == '__main__': run_server()