ftp_server.py
import socketserver
import os
import json
'''
1. 创建一个请求处理的类,并且这个类要继承 BaseRequestHandlerclass ,并且还要重写父类里handle()方法;
2. 你必须实例化 TCPServer,并且传递server IP和你上面创建的请求处理类,给这个TCPServer;
3. server.handle_requese()#只处理一个请求,server.server_forever()处理多个一个请求,永远执行
4. 关闭连接server_close()
'''
class FtpHandler(socketserver.BaseRequestHandler):
def cmd_put( self,*args ):
msg_dict = args[0]
filename = msg_dict['filename']
filesize = msg_dict['filesize']
if os.path.isfile(filename):
f =open(filename+'.new','wb')
else:
f = open(filename,'wb')
self.request.send(b'200 ok')
receivesize = 0
while receivesize < filesize:
data = self.request.recv(1024) #不能加strip()
f.write(data)
receivesize += len(data)
else:
print('file has uploaded')
def cmd_get(self,*args):
msg_dic = args[0]
filename = msg_dic['filename']
if os.path.isfile(filename):
filesize = os.stat(filename).st_size
f = open (filename,'rb')
msg_dic = {
'filesize':filesize
}
self.request.send(json.dumps(msg_dic).encode('utf-8'))
data = self.request.recv(1024)
for line in f:
self.request.send(line)
else:
print(filename,'dowloaded success...')
f.close()
def handle(self):
while True:
self.data = self.request.recv(1024).strip()
msg_dict = json.loads(self.data.decode('utf-8'))
cmd = msg_dict['action']
if hasattr(self,'cmd_%s'%cmd):
func = getattr(self,'cmd_%s'%cmd)
func(msg_dict)
if __name__ == '__main__':
host,port = '0.0.0.0',9998
server = socketserver.ThreadingTCPServer((host,port),FtpHandler)
server.serve_forever()
ftp_client.py
import socket
import os
import json
class FtpClient(object):
def __init__(self):
self.client = socket.socket()
def connect( self,ip,port ):
self.client.connect((ip,port))
def interactive( self ):
while True:
cmd = input('>>>').strip()
if len(cmd)==0:continue
cmd_str = cmd.split()[0]
if hasattr(self,'cmd_%s'%cmd_str):
func = getattr(self,'cmd_%s'%cmd_str)
func(cmd)
def cmd_put( self,*args ):
cmd_split = args[0].split()
if len(cmd_split) > 1:
filename = cmd_split[1]
if os.path.isfile(filename):
filesize = os.stat(filename).st_size
msg_dic = {
'action':'put',
'filename':filename,
'filesize':filesize
}
self.client.send(json.dumps(msg_dic).encode('utf-8'))
server_response = self.client.recv(1024)
f = open(filename,'rb')
for line in f:
self.client.send(line)
else:
print(filename,'upload success...')
f.close()
else:
print(filename,'is not exist')
def cmd_get( self ,*args):
cmd_split = args[0].split()
if len(cmd_split) > 1:
filename = cmd_split[1]
msg_dic = {
'action': 'get',
'filename': filename
}
if os.path.isfile(filename):
f = open(filename+'.get','wb')
else:
f = open(filename,'wb')
self.client.send(json.dumps(msg_dic).encode('utf-8'))
self.data = self.client.recv(1024)
msg_dic = json.loads(self.data.decode('utf-8'))
filesize = msg_dic['filesize']
self.client.send(b'200 ok')
receivesize = 0
while receivesize < filesize:
data = self.client.recv(1024)
f.write(data)
lenth = len(data)
receivesize += lenth
else:
print(filename,'dowloaded sucess....')
f.close()
ftp = FtpClient()
ftp.connect('0.0.0.0',9998)
ftp.interactive()