Unir cliente con servidor y seleccionar archivos con seleccionador nativo del cliente
parent
058ac0143e
commit
055659ab9f
159
main.py
159
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
|
||||
# ==========================
|
||||
# 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()
|
||||
|
|
|
|||
Loading…
Reference in New Issue