import socket import threading SERVER_HOST = '127.0.0.1' SERVER_PORT = 3333 class ModeloCliente: def __init__(self): self.client_socket = None self.connected = False def conectar(self, on_message_received, on_error): """Conecta el cliente al servidor.""" if self.connected: on_error("[CLIENTE] Ya estás conectado al servidor.\n") return self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: self.client_socket.connect((SERVER_HOST, SERVER_PORT)) self.connected = True threading.Thread(target=self.recibir_mensajes, args=(on_message_received, on_error), daemon=True).start() return f"[CONECTADO] Conectado al servidor {SERVER_HOST}:{SERVER_PORT}\n" except ConnectionRefusedError: self.client_socket = None return "[ERROR] El servidor no está disponible. Inícialo primero.\n" except Exception as e: self.client_socket = None return f"[ERROR] No se pudo conectar al servidor: {e}\n" def recibir_mensajes(self, on_message_received, on_error): """Recibe mensajes del servidor y los muestra en la vista.""" while True: try: mensaje = self.client_socket.recv(1024) if not mensaje: break on_message_received(mensaje.decode('utf-8')) except: on_error("[ERROR] Conexión perdida con el servidor.\n") self.client_socket.close() self.client_socket = None self.connected = False break def enviar_mensaje(self, mensaje): """Envía un mensaje al servidor.""" if mensaje and self.client_socket: try: self.client_socket.send(mensaje.encode('utf-8')) except: return "[ERROR] No se pudo enviar el mensaje.\n" return None