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