ChatPersonas/Modelo.py

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