如何从客户端发送文件到服务器,并用相同的文件名保存呢?(How to send file from

2019-10-19 23:00发布

我试图从客户端发送文件服务器蟒蛇。 它发送没有任何问题,但我想保存相同的文件名接收到的文件。 因为它是从客户端发送到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()

Answer 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

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



文章来源: How to send file from Client to Server and save it with same filename?