python3 FTP上传下载复杂版

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

#
coding:utf-8 import os import json import socket import struct class MyTcpServer(): address_family = socket.AF_INET # AF:address family地址成员 INET:internet network互联网 socket_type = socket.SOCK_STREAM # allow_reuse_address = False # 端口重用 max_packet_size = 1024 coding = "utf-8" request_queue_size = 5 server_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) if bind_and_activate: try: self.server_bind() self.server_activate() except: self.server_close() raise def server_bind(self): if self.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() def server_activate(self): self.socket.listen(self.request_queue_size) def server_close(self): self.socket.close() def get_request(self): return self.socket.accept() def close_request(self, request): request.close() def run(self): while True: self.conn, self.client_addr = self.get_request() print("from client ", self.client_addr) while True: try: head_struct = self.conn.recv(4) if not head_struct: break head_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"] if hasattr(self, cmd): func = getattr(self, cmd) func(head_dic) except Exception: break def put(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 = 0 print("file_path: ", file_path) folder_path = os.path.dirname(file_path) print("path: ", folder_path) if not os.path.exists(folder_path): os.makedirs(folder_path) with open(file_path, "wb") as f: while recv_size < filesize: 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 import os import json import socket import struct class MyTcpClient(): address_family = socket.AF_INET socket_type = socket.SOCK_STREAM allow_reuse_address = False max_packet_size = 8192 coding = "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) if connect: try: self.client_connect() except: self.client_close() raise def client_connect(self): self.socket.connect(self.server_address) def client_close(self): self.socket.close() def run(self): while True: inp = input(">>>: ").strip() if not inp: continue l = inp.split() cmd = l[0] if hasattr(self, cmd): func = getattr(self, cmd) func(l) def put(self, args): cmd = args[0] filename = args[1] if not os.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 in f: 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下创建.
posted on 2019-05-29 00:41  lilyxiaoyy  阅读(710)  评论(0编辑  收藏  举报

返回
顶部