繁体   English   中英

使用Python从客户端向服务器发送不同的文件

[英]Sending different files from Client to Server in Python

我正在尝试使用python将文件从客户端发送到服务器。 它正在发送,但是问题是我没有得到相同的文件名。 假设文件名是File1.txt。 将其发送到服务器时,将以file_.txt的形式接收 我为此编写的代码是:

客户代码

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 = 31400
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
fsize=int(conn.recv(8))               
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()

如何获得相同的文件名...以及如果我必须接收任何类型的文件(如.pdf,.txt,.jpeg等)怎么办。请帮助我,我是python的新手。

您要么需要使用ftputil之类的库, 要么以某种方式对文件进行编码,例如UUENCODE

或者,您将必须使用单独的事务来实现自己的协议,以发送文件名和大小,然后发送内容。

  • 客户端获取文件路径,然后检查大小以及基本名称。
  • 客户端以预先格式化的方式发送文件的基本名称和大小。
  • 服务器接收并解释上述信息,然后打开称为基本名称的文件进行写入。
  • 客户端发送二进制数据。
  • 服务器将二进制数据写入打开的文件。
  • 两者都为文件计算MD5或类似文件,并交换信息以确保匹配。

请注意,以上内容并未涵盖处理问题,例如数据丢失,仅ASCII链接,损坏,作为块发送等。请记住,FTP自1971年以来一直在积极使用和开发,并建议在1998年后期进行根本性的更改。

首先,您没有在服务器端以file_.txt的形式收到它,而是打开一个名为file_.txt的新文件,并将其从服务器端收到的内容复制到新创建的file_中。文本

我的解决方案是从文件中获取文件名,并将其与内容一起发送。 获取文件名示例:

import os
print os.path.splitext("path_to_file")[0]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM