SoloCodigo

Programación Web y Scripting => Python => Mensaje iniciado por: $francisco en Sábado 24 de Marzo de 2012, 05:25

Título: ejercicio para pasar un archivo de servidor cliente no puedo resolverlo
Publicado por: $francisco en Sábado 24 de Marzo de 2012, 05:25
muy buenas, decir que soi nuevo en este foro, explico un poco mi situacion, ya consegui enviar datos mediante el modulo os con la funcion listdir pero ahora quiero pasar archivos como por ejemplo un archivo.exe o una foto, se que estare muy lejos de conseguirlo pero aber si me podeis echar una mano, aqui os dejo lo que he llegado ha hacer, ya se que no me abre nisiquiera hacercado ha como se hacer pero bueno... :

cliente:

Código: Python
  1. import socket
  2.  
  3. s = socket.socket()
  4. s.bind(("", 9999))
  5. s.listen(2)
  6.  
  7. while True:
  8.     recivido = sc.recv(1024)
  9.     print recivido
  10.     if recivido == "":
  11.         print "fin del listado \n"
  12.         break
  13.  
  14. raw_input("pulsa enter para cerrar conexiones")
  15. s.close()
  16. sc.close()
  17.  

servidor:

Código: Python
  1. import socket
  2.  
  3. s = socket.socket()
  4. s.connect(("192.168.1.101", 9999))
  5.  
  6. f = open("archivo.exe", "rb")
  7.  
  8. s.send(f)
  9.  
  10. raw_input("enter para salir")
  11.  
  12. s.close()
Título: Re:ejercicio para pasar un archivo de servidor cliente no puedo resolverlo
Publicado por: RadicalEd en Domingo 25 de Marzo de 2012, 16:58
No puedes envíar la variable f, ya que contiene solamente el buffer donde está abierto el fichero, debes recorrerlo
Código: Python
  1. f = open("archivo.exe", "rb")
  2. while True:
  3.       linea = f.readline()
  4.       if not linea: break
  5.       s.send(linea)
  6.  
Aunque esto es un poco loco ya que son archivos binarios, yo los enviaría jugando con base64
Código: Python
  1. import base64
  2. f = open("archivo.exe", "rb")
  3. while True:
  4.       encoded = base64.b64encode(f.readline())
  5.       if not f.readline(): break
  6.       s.send(encoded)
  7.  
Algo así, revisalo, además deberás decodificar el base64 al otro lado
Título: Re:ejercicio para pasar un archivo de servidor cliente no puedo resolverlo
Publicado por: $francisco en Domingo 25 de Marzo de 2012, 17:46
muchas gracias por tu script, pero encontre una forma de poder transferir cualquier archivo solo hay que definir f.rear() por ejemplo:

Código: Python
  1. f = open("nombre_archivo.extension", "wb")  #le digo que lo abra y lo lea en binario
  2.  
  3. data = f.read() #le digo que lo lea o lo recorra como lo a leido al abrirlo en binario de forma que se #envia en binario
  4.  
  5. s.send(data) #envio con data por socket lo que lei en el archivo en binario y lo envio a quien #tengamos puesto

al igual que se envia en binario el quien lo reciva tendra que crear un archvio y copiarlo tambien en binario ejemplo:

cliente:

Código: Python
  1. recivido = sc.recv(99999)
  2. nombre = raw_input("escriba el nombre del archivo: ")#nombre.extension si no no tendra formato
  3. f = open(nombre, "wb")
  4. f.write(revicido)

de esta manera todo lo que se envie aunque sea musica imajenes... funciona, yo lo e probado y funciona.