58 lines
2.2 KiB
Python
58 lines
2.2 KiB
Python
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
|