You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

126 lines
3.8 KiB

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()

Powered by INFORMATICA.FP.EDU.ES.