python3 ftp上传,python3 FTP上传下载复杂版

这篇博客详细介绍了如何使用Python创建一个简易FTP服务器(MyTcpServer),以及一个客户端(MyTcpClient)进行文件上传。服务器接收文件请求,存储在预设的file_upload文件夹中。客户端通过连接服务器并发送指令,实现文件上传功能。
摘要由CSDN通过智能技术生成

--------------------------------ftp_server.py--------------------------------

#coding:utf-8

importosimportjsonimportsocketimportstructclassMyTcpServer():

address_family= socket.AF_INET #AF:address family地址成员 INET:internet network互联网

socket_type = socket.SOCK_STREAM #流

allow_reuse_address = False #端口重用

max_packet_size = 1024coding= "utf-8"request_queue_size= 5server_dir= "file_upload"

def __init__(self, server_address, bind_and_activate=True):

self.server_address=server_address

self.socket=socket.socket(self.address_family, self.socket_type)ifbind_and_activate:try:

self.server_bind()

self.server_activate()except:

self.server_close()raise

defserver_bind(self):ifself.allow_reuse_address:

self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1)

self.socket.bind(self.server_address)

self.server_address=self.socket.getsockname()defserver_activate(self):

self.socket.listen(self.request_queue_size)defserver_close(self):

self.socket.close()defget_request(self):returnself.socket.accept()defclose_request(self, request):

request.close()defrun(self):whileTrue:

self.conn, self.client_addr=self.get_request()print("from client", self.client_addr)whileTrue:try:

head_struct= self.conn.recv(4)if not head_struct: breakhead_len= struct.unpack('i', head_struct)[0]print("head len:", head_len)

head_json=self.conn.recv(head_len).decode(self.coding)

head_dic=json.loads(head_json)print("head_dic:", head_dic)

cmd= head_dic["cmd"]ifhasattr(self, cmd):

func=getattr(self, cmd)

func(head_dic)exceptException:break

defput(self, args):

file_path=os.path.normpath(os.path.join(

os.path.dirname(__file__),

self.server_dir,

args['filename']

))

filesize= args['filesize']print("filesize:", filesize)

recv_size=0print("file_path:", file_path)

folder_path=os.path.dirname(file_path)print("path:", folder_path)if notos.path.exists(folder_path):

os.makedirs(folder_path)

with open(file_path,"wb") as f:while recv_size

recv_data=self.conn.recv(self.max_packet_size)

f.write(recv_data)

recv_size+=len(recv_data)print("recvsize: %s filesize:%s" %(recv_size, filesize))

ip_port= ("127.0.0.1", 8001)

tcpserver1=MyTcpServer(ip_port)

tcpserver1.run()

------------------------------------ftp_client.py------------------------------------#coding:utf-8

importosimportjsonimportsocketimportstructclassMyTcpClient():

address_family=socket.AF_INET

socket_type=socket.SOCK_STREAM

allow_reuse_address=False

max_packet_size= 8192coding= "utf-8"request_queue_size= 5

def __init__(self, server_address, connect=True):

self.server_address=server_address

self.socket=socket.socket(self.address_family, self.socket_type)ifconnect:try:

self.client_connect()except:

self.client_close()raise

defclient_connect(self):

self.socket.connect(self.server_address)defclient_close(self):

self.socket.close()defrun(self):whileTrue:

inp= input(">>>:").strip()if not inp: continuel=inp.split()

cmd=l[0]ifhasattr(self, cmd):

func=getattr(self, cmd)

func(l)defput(self, args):

cmd=args[0]

filename= args[1]if notos.path.isfile(filename):print("file: %s is not exists" %filename)return

else:

filesize=os.path.getsize(filename)

head_dic={"cmd": cmd,"filename": os.path.basename(filename),"filesize": filesize

}print("head_dic", head_dic)

head_json=json.dumps(head_dic)

head_json_bytes=head_json.encode(self.coding)

head_struct= struct.pack('i', len(head_json_bytes))

self.socket.send(head_struct)

self.socket.send(head_json_bytes)

send_size=0

with open(filename,"rb") as f:for line inf:

self.socket.send(line)

send_size+=len(line)print("send_size", send_size)else:print("upload successful")

ip_port= ("127.0.0.1", 8001)

client=MyTcpClient(ip_port)

client.run()

先运行tcp_server.py

再运行tcp_client.py

最后输入put 文件名

会在tcp_server.py所在的目录下创建一个file_upload文件夹,并将客户端上传的文件,直接在file_upload下创建.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值