elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Python (Moderador: Danielㅤ)
| | |-+  [PYTHON]Ejemplo: transferir archivos por internet
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [PYTHON]Ejemplo: transferir archivos por internet  (Leído 7,624 veces)
WaAYa HaCK

Desconectado Desconectado

Mensajes: 292


Arduino, Android and music


Ver Perfil
[PYTHON]Ejemplo: transferir archivos por internet
« en: 21 Febrero 2012, 15:15 pm »

Hola! Posteo un simple script de ejemplo para mostrar el funcionamiento de los sockets y demás en Python.

El script consta de un cliente y un servidor. Está escrito en catalán, pero es perfectamente inteligible.

Cliente:
Código
  1. # enviar.py v1.2
  2. # -*- coding: cp1252 -*-
  3. # ---------------
  4. # Changelog:
  5. # + Diccionaris
  6. # + Avisos de lectura i transferencia
  7. # + Funcions de mida d'arxiu
  8.  
  9. # importamos los modulos necesarios:
  10. import socket, os
  11. # definimos el puerto de control CPORT y el puerto multimedia MPORT
  12. CPORT = 9091
  13. MPORT = 9090
  14. # una funcion para transformar un tamaño en bytes a un tamaño más fácil de leer:
  15. def midafap(mida):
  16. sufixos = [("B",2**10), ("K",2**20), ("M",2**30), ("G",2**40), ("T",2**50)]
  17. for suf, lim in sufixos:
  18. if mida > lim:
  19. continue
  20. else:
  21. return round(mida/float(lim/2**10),2).__str__()+suf
  22.  
  23. print "Enviar arxius per INTRnet!"
  24. # un diccionario, esto es por comodidad mía
  25. # pedimos dónde estamos: el instituto, casa, o solo, para probar cosas
  26. sel = raw_input("Indica el host remot(institut, casa, sol): ")
  27. insdic = {"FAPFAPFAP" : '192.168.171.12',
  28.           "FAPFAP" : '192.168.171.17',
  29.           "FAP" : '192.168.171.19'}
  30. casadic = {"SERVER" : '192.168.1.34'}
  31. soldic = {"Me" : 'localhost'}
  32. # ahora tenemos un diccionario dentro de otro:
  33. bigdic = {"institut" : insdic,
  34.           "casa" : casadic,
  35.           "sol" : soldic}
  36. final = bigdic[sel]
  37. print final
  38. # si hemos elegido "institut", nos dirá las IPs y escribimos FAPFAPFAP.
  39. sel2 = raw_input("Indica el host remot de la llista: ")
  40. HOST = final[sel2]
  41.  
  42. # el archivo en sí
  43. FILE = raw_input("Arrossega l'arxiu: ")
  44. # cambiamos comillas, para evitar errores en los archivos con espacios:
  45. FILE = FILE.replace('"', '')
  46. # creamos un socket que envía la ruta del archivo:
  47. cs = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  48. # se conecta al puerto de control:
  49. cs.connect((HOST, CPORT))
  50. # envía la ruta del archivo:
  51. cs.send("SEND " + FILE)
  52. cs.close()
  53.  
  54. # otro socket, que envía el archivo:
  55. ms = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  56. # se conecta al puerto multimedia:
  57. ms.connect((HOST, MPORT))
  58.  
  59. # abrimos el archivo para leerlo:
  60. f = open(FILE, "rb")
  61. data = f.read()
  62. f.close()
  63.  
  64. # obtenemos el tamaño del archivo, en bytes:
  65. midabytes = os.path.getsize(FILE)
  66. # usamos la función anterior para convertir el tamaño:
  67. # Archivo guarra.fap leído (682,13M)
  68. print "Arxiu ", FILE, "llegit (", str(midafap(midabytes)), ")."
  69. # enviamos los datos del archivo:
  70. ms.send(data)
  71. ms.close()
  72. # fin
  73. print "Arxiu ", FILE, "enviat (", str(midafap(midabytes)), ")."
  74. raw_input("Prem una tecla per tancar...")
  75.  

Servidor:
Código
  1. # rebre.py
  2.  
  3. # importamos módulos, unos cuantos más...
  4. import os, socket, time, string, sys, urlparse
  5. from threading import *
  6.  
  7. #------------------------------------------------------------------------
  8.  
  9. # creamos un objeto de tipo StreamHandler:
  10. class StreamHandler ( Thread ):
  11. #creamos un inicializador:
  12.    def __init__( this ):
  13.        Thread.__init__( this ) # nos referimos al objeto mismo
  14.  
  15.    def run(this):
  16.        this.process() #aquí tenemos un método que nos muestra que estamos trabajando con objetos de tipo socket.
  17.  
  18.    def bindmsock( this ):
  19.        this.msock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  20.        # enlazamos el "this" al puerto 9090 (Multimedia):
  21.        this.msock.bind(('', 9090))
  22.        this.msock.listen(1)
  23.        print '[INTR] Esperant al port 9090'
  24.  
  25.    def acceptmsock( this ):
  26.        # aceptamos la conexión...
  27.        this.mconn, this.maddr = this.msock.accept()
  28.        print '[INTR] Ieepa, es connecta', this.maddr
  29.  
  30.    def bindcsock( this ):
  31.        # enlazamos al puerto 9091 (Control):
  32.        this.csock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  33.        this.csock.bind(('', 9091))
  34.        this.csock.listen(1)
  35.        print '[Control] Esperant al port 9091'
  36.  
  37.    def acceptcsock( this ):
  38.        # aceptamos...
  39.        this.cconn, this.maddr = this.csock.accept()
  40.        print '[Control] Ieepa, es connecta', this.maddr
  41.  
  42.        while 1:
  43.            # captamos datos:
  44.            data = this.cconn.recv(1024)
  45.            if not data: break
  46.            # si los datos recibidos empiezan por SEND, captamos el nombre de archivo
  47.            if data[0:4] == "SEND": this.filename = data[5:]
  48.            print '[Control] Preparat per rebre "%s"' % this.filename
  49.            break
  50.  
  51.    def transfer( this ):
  52.        print '[INTR] Transferint dades de "%s"' % this.filename
  53.        # captamos solamente el nombre de archivo y su extensión:
  54.        nomfinal = os.path.basename(this.filename)
  55.        # lo guardamos en el directorio de Recibido
  56.        f = open("C:/INTRnet/Rebut/"+nomfinal,"wb")
  57.        # ahora, el bucle que captura datos en sí:
  58.        while 1:
  59.            data = this.mconn.recv(1024)
  60.            if not data: break
  61.            f.write(data)
  62.        f.close()
  63.  
  64.        # hemos escrito los datos en el nuevo archivo
  65.        print '[Media] Rebut "%s"' % this.filename
  66.        print '[Media] Tancant el flux de "%s"' % this.filename
  67.        os.popen("msg.exe * S'ha rebut l'arxiu "+ nomfinal)
  68.        # y ya hemos recibido el archivo!
  69.  
  70.    def close( this ):
  71.        # cerramos todos los sockets:
  72.        this.cconn.close()
  73.        this.csock.close()
  74.        this.mconn.close()
  75.        this.msock.close()
  76.  
  77.    def process( this ):
  78.        # siempre aceptamos las conexion
  79.        while 1:
  80.            this.bindcsock()
  81.            this.acceptcsock()
  82.            this.bindmsock()
  83.            this.acceptmsock()
  84.            this.transfer()
  85.            this.close()
  86.  
  87. #------------------------------------------------------------------------
  88.  
  89. # creamos un objeto StreamHandler:
  90. s = StreamHandler()
  91. # usamos el método de Thread (dentro del módulo threading) para iniciar:
  92. s.start()
  93. #fin
  94.  

Eso es todo. Funciona de maravilla en redes locales, y por IP pública o No-IP también ;)

El problema viene en los archivos con acentos, que dan error. Haré un filtro para eliminar los carácteres.

Cualquier duda, comentad!


En línea

La cacatúa yoyó es nueva en el zoo!
Jirp96

Desconectado Desconectado

Mensajes: 46


Ver Perfil
Re: [PYTHON]Ejemplo: transferir archivos por internet
« Respuesta #1 en: 21 Febrero 2012, 16:10 pm »

Hola!
Esta muy bueno, lo voy a guardar para leerlo(y entenderlo xD)
Por cierto, tengo una duda sobre la clase StreamHandler: por que usas "this" en ves de self? es por alguna razon en particular o yo estoy confundido y "this" no lo usas para lo mismo que se usaría self? :huh:
Saludos!


En línea

WaAYa HaCK

Desconectado Desconectado

Mensajes: 292


Arduino, Android and music


Ver Perfil
Re: [PYTHON]Ejemplo: transferir archivos por internet
« Respuesta #2 en: 21 Febrero 2012, 22:12 pm »

Es cosa del threading, lo probé con self, claro, y no funcionaba. Busqué por internet y me salió que debía usar this. Pues hala.

Saludos!
En línea

La cacatúa yoyó es nueva en el zoo!
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.885



Ver Perfil
Re: [PYTHON]Ejemplo: transferir archivos por internet
« Respuesta #3 en: 22 Febrero 2012, 08:32 am »

Me mataste!
Tu script es más complicado de lo que imaginaba, Ya por el principio me pierdo con CPORT y MPORT no se para que sirven esos puertos... Tengo que estudiar cada cosa del script poco a poco xD , Lo único que entiendo de ahí es el catalá y poco más :xD

Está molt currat :) y muy explicado, se agradece, Aunque si haces uno para enviar archivos a mediafire, Mejor  >:D

Un saludo

PD:
Citar
{"FAPFAPFAP" : '192.168.171.12',
"FAPFAP" : '192.168.171.17',
"FAP" : '192.168.171.19'}

XD
En línea



WaAYa HaCK

Desconectado Desconectado

Mensajes: 292


Arduino, Android and music


Ver Perfil
Re: [PYTHON]Ejemplo: transferir archivos por internet
« Respuesta #4 en: 22 Febrero 2012, 09:22 am »

CPORT y MPORT son dos puertos diferentes. En el puerto de control, envío una cadena con la ruta del archivo, para que pueda guardarse. En el puerto de multimedia, envío los datos del archivo.

En FAPFAPFAP estaban los nombres de mis amigos ;) usamos el script para pasarnos "apuntes". El problema es que la Wifi del insti está capada, y a veces no funciona. Entonces, Skype o Dropbox. Pero, cuando me paso cosas con mi padre, funca de fruta madre  ;D
En línea

La cacatúa yoyó es nueva en el zoo!
MacGyver87

Desconectado Desconectado

Mensajes: 64


Sam, vigila.....


Ver Perfil
Re: [PYTHON]Ejemplo: transferir archivos por internet
« Respuesta #5 en: 22 Febrero 2012, 11:26 am »

Muy bueno!! Sencillo y práctico!!
En línea

'El hombre es mortal por sus temores e inmortal por sus deseos'
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Transferir archivos
Programación Visual Basic
neider 6 2,496 Último mensaje 3 Abril 2006, 16:21 pm
por neider
Transferir multiples archivos
PHP
hello 9 4,554 Último mensaje 4 Septiembre 2009, 04:59 am
por turion
Transferir archivos por telnet
Redes
nelsec 2 6,817 Último mensaje 27 Octubre 2010, 23:26 pm
por nelsec
Ejemplo Python suma_matrices
Scripting
Meta 9 5,241 Último mensaje 18 Noviembre 2010, 06:48 am
por Meta
Problema con Python archivos
Scripting
AdeLax 2 2,903 Último mensaje 26 Octubre 2013, 21:37 pm
por 0x5d
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines