2014-04-21 50 views
1

我想在python中将文件从客户端发送到服务器。它发送没有任何问题,但我想用相同的文件名保存接收到的文件。因为它是从客户端发送到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中获得“READY”。相反,你必须使用类似的东西:

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 

如果你想知道在服务器上的文件名,你也必须将其传输到服务器,太。顺便说一句,“准备”有5个字符,而不是8.

相关问题