2014-04-21 5 views
1

J'essaye d'envoyer le dossier du client au serveur en python. Il envoie sans problème, mais je veux enregistrer ce fichier reçu avec le même nom de fichier. Je ne reçois pas idée comment enregistrer ce fichier avec le même nom de fichier tel qu'il est envoyé du client à Server.The code que je l'ai écrit pour cela est:Comment envoyer un fichier du client au serveur et l'enregistrer avec le même nom de fichier?

Code client

import socket, os, shutil 
from stat import ST_SIZE 
HOST=raw_input("Please enter IP-address : ") 

PORT=int(raw_input("Please enter PORT Number : ")) 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((HOST,PORT)) 
if s.recv(8)!='READY': 
    raw_input('Unable to connect \n\n Press any key to exit ...') 
    s.close() 
    exit() 
path=raw_input("Please enter the complete PATH of your file : ") 

f=open(path,'rb') 
fsize=os.stat(f.name)[ST_SIZE] 


s.sendall(str(fsize).zfill(8)) 
sfile = s.makefile("wb") 
shutil.copyfileobj(f, sfile) 
sfile.close() 
s.close() 
f.close() 

Code du serveur

import socket 
import shutil 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
HOST = '' 
PORT = 23240 
s.bind((HOST, PORT)) 
s.listen(3) 
conn, addr = s.accept()    
print 'conn at address',addr 
conn.sendall('READY') 
i=1 
f = open(r'file_'+ str(i)+".txt",'wb') 
i=i+1 

print 'File size',fsize 
sfile = conn.makefile("rb") 
shutil.copyfileobj(sfile, f) 
sfile.close() 

f.write(conn.recv(fsize))   
f.close() 
conn.close() 
s.close() 
+0

Pourquoi ne pas simplement envoyer f.name? –

+0

côté client, je dois entrer le chemin complet du fichier. et côté récepteur, je veux recevoir ce fichier avec le même nom et le même type de fichier ... – Ruchir

Répondre

1

Votre code n'est pas très robuste. recv (cnt) fournit jusqu'à cnt octets de données, ou moins. Donc ce n'est pas sûr, vous lisez tout le dossier. Il n'est même pas sûr, vous obtenez le "READY" dans un recv. , Vous avez au lieu d'utiliser quelque chose comme ça:

def recv_all(sock, bufsize): 
    result = '' 
    while bufsize>0: 
     data = sock.recv(min(bufsize, 4096)) 
     if not data: 
      raise IOError("Socket closed") 
     result += data 
     bufsize -= len(data) 
    return result 

Si vous voulez connaître le nom de fichier sur le serveur, vous devez également transférer au serveur, aussi. Au fait, "READY" a 5 caractères, pas 8.

Questions connexes