--------------------------------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下创建.