import socket import threading import time import tkinter as tk #LISTA USUARIOS lista_usuarios = None def iniciar_servidor(host, puerto): global lista_usuarios #SOCKET socket_servidor = socket.socket(socket.AF_INET, socket.SOCK_STREAM) socket_servidor.bind((host, puerto)) #ESCUCHA socket_servidor.listen(1) print(f"SERVIDOR INICIADO EN LA DIRECCION {host}:{puerto}") # DICCIONARIO clientes = {} # BUCLE INFINITO PARA ACCEPTAR CONEXIONES while True: # ACCEPTAR CONEXION socket_cliente, direccion = socket_servidor.accept() # CREAR UN NUEVO HILO POR CADA CLIENTE hilo_cliente = threading.Thread(target=manejar_cliente, args=(socket_cliente, clientes)) hilo_cliente.start() def manejar_cliente(socket_cliente, clientes): # NOMBRE CLIENTE nombre = socket_cliente.recv(1024).decode() # AGREGAMOS CLIENTES AL DICCIONARIO CON UN NOMBRE clientes[socket_cliente] = nombre print(f"{nombre} conectado desde {socket_cliente.getpeername()}") # Bucle infinito para manejar la interacción con el cliente while True: try: # Espera 5 segundos time.sleep(5) # Obtiene el número de clientes conectados clientes_conectados = len(clientes) # Actualiza la lista de usuarios en la interfaz gráfica actualizar_lista_usuarios(clientes) # Actualiza el contador en la GUI del servidor actualizar_contador_usuarios(clientes_conectados) # Construye el mensaje con el número de clientes conectados mensaje = f"CANTIDAD DE CLIENTES CONECTADOS: {clientes_conectados}" # Envía el mensaje al cliente actual socket_cliente.send(mensaje.encode()) except Exception as e: print(e) # Maneja cualquier excepción eliminando al cliente del diccionario y cerrando su socket if socket_cliente in clientes: del clientes[socket_cliente] socket_cliente.close() # Envía un mensaje a los clientes restantes informando que este cliente se ha desconectado for cliente in clientes: cliente.send(f"{nombre} DESCONECTADO".encode()) break def actualizar_lista_usuarios(clientes): global lista_usuarios # Obtener los nombres de usuario de los clientes conectados usuarios_conectados = [nombre for cliente, nombre in clientes.items()] # Limpiar la lista de usuarios en la interfaz gráfica lista_usuarios.delete(0, tk.END) # Agregar los usuarios conectados a la lista de usuarios en la interfaz gráfica for usuario in usuarios_conectados: lista_usuarios.insert(tk.END, usuario) def actualizar_contador_usuarios(contador): global contador_usuarios contador_usuarios.config(text=str(contador)) def generar_interfaz(): global lista_usuarios global contador_usuarios # VENTANA ventana = tk.Tk() ventana.title("Estado del servidor") # CONTADOR contador_usuarios = tk.Label(ventana, text="0", font=("Arial", 72), fg="green") contador_usuarios.pack(pady=50) # TITULO titulo_nombre_clientes = tk.Label(ventana, text="NOMBRE CLIENTES CONECTADOS", font=("Arial", 18)) titulo_nombre_clientes.pack() #LISTA USUARIOS ACTIVOS lista_usuarios = tk.Listbox(ventana) lista_usuarios.pack() #ESPERAR EVENTOS ventana.mainloop() # Bloque principal if __name__ == "__main__": # Definición del host y puerto del servidor HOST = 'localhost' PUERTO = 8088 # Inicia el servidor en un hilo de ejecución separado threading.Thread(target=iniciar_servidor, args=(HOST, PUERTO)).start() # Crea la interfaz gráfica en un hilo de ejecución separado threading.Thread(target=generar_interfaz).start()