import socket import threading import tkinter as tk from tkinter import scrolledtext from server import start_server # Importamos la función para iniciar el servidor # Configuración del cliente SERVER_HOST = '127.0.0.1' SERVER_PORT = 3333 class ChatApp: def __init__(self, root): self.root = root self.root.title("Chat Cliente-Servidor") # Botón para iniciar el servidor self.server_button = tk.Button(root, text="Iniciar Servidor", command=self.start_server) self.server_button.grid(row=0, column=0, padx=10, pady=10) # Botón para conectar el cliente self.connect_button = tk.Button(root, text="Conectar Cliente", command=self.start_client) self.connect_button.grid(row=0, column=1, padx=10, pady=10) # Área de chat self.chat_display = scrolledtext.ScrolledText(root, wrap=tk.WORD, state='disabled', width=50, height=20) self.chat_display.grid(row=1, column=0, padx=10, pady=10, columnspan=2) # Campo de entrada de mensajes self.message_entry = tk.Entry(root, width=40) self.message_entry.grid(row=2, column=0, padx=10, pady=10) # Botón para enviar mensajes self.send_button = tk.Button(root, text="Enviar", command=self.send_message, state='disabled') self.send_button.grid(row=2, column=1, padx=10, pady=10) self.client_socket = None # Se inicializa el socket del cliente en None self.connected = False # Variable para manejar el estado de conexión def start_server(self): """ Inicia el servidor en segundo plano """ threading.Thread(target=start_server, daemon=True).start() self.append_message("[SERVIDOR] Servidor iniciado en segundo plano...\n") def start_client(self): """ Conecta el cliente al servidor """ if self.connected: self.append_message("[CLIENTE] Ya estás conectado al servidor.\n") return # Intentar crear un nuevo socket self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: self.client_socket.connect((SERVER_HOST, SERVER_PORT)) self.append_message(f"[CONECTADO] Conectado al servidor {SERVER_HOST}:{SERVER_PORT}\n") threading.Thread(target=self.receive_messages, daemon=True).start() self.send_button.config(state='normal') # Habilitar botón de enviar mensajes self.connected = True except ConnectionRefusedError: self.append_message("[ERROR] El servidor no está disponible. Inícialo primero.\n") self.client_socket = None # Restablecer socket para permitir nuevos intentos except Exception as e: self.append_message(f"[ERROR] No se pudo conectar al servidor: {e}\n") self.client_socket = None # Restablecer socket def receive_messages(self): """ Recibe mensajes del servidor en un hilo separado """ while True: try: message = self.client_socket.recv(1024) if not message: break self.append_message(message.decode('utf-8')) except: self.append_message("[ERROR] Conexión perdida con el servidor.\n") self.client_socket.close() self.client_socket = None self.connected = False self.send_button.config(state='disabled') # Deshabilitar el botón de enviar break def send_message(self): """ Envía un mensaje al servidor """ message = self.message_entry.get() if message and self.client_socket: try: self.client_socket.send(message.encode('utf-8')) self.message_entry.delete(0, tk.END) except: self.append_message("[ERROR] No se pudo enviar el mensaje.\n") def append_message(self, message): """ Agrega un mensaje a la ventana de chat """ self.chat_display.config(state='normal') self.chat_display.insert(tk.END, message + '\n') self.chat_display.config(state='disabled') self.chat_display.yview(tk.END) if __name__ == "__main__": root = tk.Tk() app = ChatApp(root) root.mainloop()