From 055659ab9faf1877d4a0a3dc8df831789a43fcf5 Mon Sep 17 00:00:00 2001 From: Juanposo Date: Mon, 1 Dec 2025 15:25:01 -0300 Subject: [PATCH] Unir cliente con servidor y seleccionar archivos con seleccionador nativo del cliente --- main.py | 159 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- tktest.py | 6 +++ 2 files changed, 162 insertions(+), 3 deletions(-) create mode 100644 tktest.py diff --git a/main.py b/main.py index ad39583..d3eebaf 100644 --- a/main.py +++ b/main.py @@ -1,4 +1,157 @@ -# Importar librerías y archivos +# cliente_servidor.py +import socket +import os +import subprocess +import threading +import platform +import tkinter as tk +from tkinter import filedialog -import sistema_operativo -# import \ No newline at end of file +# ========================== +# SERVIDOR +# ========================== + +def obtener_puerto_disponible(): + for puerto in range(5000, 5101): + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + try: + s.bind(('0.0.0.0', puerto)) + s.close() + return puerto + except: + s.close() + continue + raise Exception("❌ No hay puertos disponibles entre 5000 y 5100.") + + +puerto_servidor = obtener_puerto_disponible() + +def iniciar_servidor(): + if not os.path.exists("recibidos"): + os.makedirs("recibidos") + + server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + server.bind(('0.0.0.0', puerto_servidor)) + server.listen(1) + + print(f"\n🖥️ Servidor escuchando en puerto {puerto_servidor}...") + print("=" * 40) + + while True: + try: + client, addr = server.accept() + print(f"\n📨 Conexión entrante de: {addr}") + + info = client.recv(1024).decode() + nombre, tamaño = info.split("|") + tamaño = int(tamaño) + + with open(f"recibidos/{nombre}", "wb") as f: + recibido = 0 + while recibido < tamaño: + datos = client.recv(4096) + if not datos: + break + f.write(datos) + recibido += len(datos) + + print(f"✅ Archivo recibido: {nombre}") + client.send("Archivo recibido correctamente".encode()) + client.close() + + except Exception as e: + print(f"❌ Error del servidor: {e}") + continue + +# ========================== +# FUNCIONES CLIENTE +# ========================== + +def limpiar_pantalla(): + subprocess.run('clear', shell=True) + +def mostrar_menu(): + print("🖥️ ENVIADOR DE ARCHIVOS") + print("=" * 30) + print("1. 📁 Seleccionar archivo y enviar") + print("2. 🚪 Salir") + print("=" * 30) + +def seleccionar_archivo(): + root = tk.Tk() + root.withdraw() # Oculta la ventana principal + + # Abre el selector de archivos nativo del SO + archivo = filedialog.askopenfilename( + title="Selecciona un archivo", + initialdir="." + ) + + root.destroy() + return archivo + +def enviar_archivo(ruta, ip_servidor): + if not ruta or not os.path.exists(ruta): + print("❌ No se seleccionó archivo o no existe.") + input("Enter para continuar...") + return + + try: + client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + client.connect((ip_servidor, 5000)) + + nombre = os.path.basename(ruta) + tamaño = os.path.getsize(ruta) + + client.send(f"{nombre}|{tamaño}".encode()) + + print(f"📤 Enviando archivo: {nombre}...") + with open(ruta, "rb") as f: + while True: + datos = f.read(4096) + if not datos: + break + client.send(datos) + + print("⏳ Esperando confirmación...") + respuesta = client.recv(1024).decode() + print(f"✅ {respuesta}") + client.close() + + input("Enter para continuar...") + + except Exception: + print("❌ Error al conectar con el dispositivo") + input("Enter para continuar...") + +# ========================== +# PROGRAMA +# ========================== + +def main(): + # Lanzar servidor en hilo + hilo_servidor = threading.Thread(target=iniciar_servidor, daemon=True) + hilo_servidor.start() + + while True: + limpiar_pantalla() + mostrar_menu() + + opcion = input("\nSelecciona una opción (1-2): ") + + if opcion == "1": + ip = input("📡 IP destino: ") + print("📁 Selecciona archivo...") + archivo = seleccionar_archivo() + enviar_archivo(archivo, ip) + + elif opcion == "2": + print("👋 Saliendo...") + break + + else: + print("❌ Opción inválida") + input("Enter para continuar...") + +if __name__ == "__main__": + main() diff --git a/tktest.py b/tktest.py new file mode 100644 index 0000000..e3f1844 --- /dev/null +++ b/tktest.py @@ -0,0 +1,6 @@ +from tkinter import filedialog, Tk + +r = Tk() +r.withdraw() +print(filedialog.askopenfilename()) +r.destroy()