2014-04-21 3 views
1

파이썬에서 클라이언트에서 서버로 파일을 보내려고합니다. 문제없이 전송하지만 수신 된 파일을 동일한 파일 이름으로 저장하려고합니다. 그것이 내가 이것을 쓴 한 Server.The 코드를 클라이언트에서 보낸 나는 어떻게 같은 파일 이름으로 해당 파일을 저장하는 생각을받지 못했습니다 것은 :클라이언트에서 서버로 파일을 보내고 동일한 파일 이름으로 저장하는 방법?

클라이언트 코드

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() 

서버 코드

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

f.name을 보내지 않는 이유는 무엇입니까? –

+0

클라이언트 측에서 파일의 전체 경로를 입력해야합니다. 및 수신기 쪽, 같은 이름과 동일한 파일 형식으로 해당 파일을 받고 싶습니다 ... – Ruchir

답변

1

코드가 강력하지 않습니다. recv (cnt)는 최대 cnt 바이트의 데이터를 전달합니다. 따라서 확실하지는 않습니다. 전체 파일을 읽었습니다. 그것은 확실하지 않습니다, 당신은 하나의 recv에서 "준비"를 얻을. 대신, 당신은 같은 것을 사용해야합니다 :

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 

서버에서 파일 이름을 알고 싶다면, 당신은 또한 너무 서버로 전송해야합니다. 덧붙여서 "READY"는 8이 아닌 5 자입니다.

관련 문제