import socket import threading class ModeloCliente: def __init__(self): self.client_socket = None self.connected = False self.host = '127.0.0.1' # Valores por defecto self.port = 3333 def set_host_port(self, host, port): """Actualiza los valores de host y port.""" self.host = host self.port = port def conectar(self, on_message_received, on_error): """Conecta el cliente al servidor con el host y puerto definidos.""" 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((self.host, self.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 {self.host}:{self.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