server端
from socket import *
import os
import time
FILE_PATH = 'usr/bin'
class FtpServer(object):
def __init__(self, connfd):
self.connfd = connfd
def do_list(self):
filelist = os.listdir(FILE_PATH)
# 服务器端确认请求是否可以接收
if not filelist or filelist==None:
self.connfd.send(b'Fail')
self.connfd.send(b'OK')
time.sleep(0.1)
for file in filelist:
if file[0]!='.' and os.path.isfile(FILE_PATH + file):
self.connfd.send(file.encode())
time.sleep(0.1)
self.connfd.send(b'##')
print('文件列表发送完毕')
return
def do_get(self,filename):
try:
fd = open(FILE_PATH+filename,'rb')
except:
self.connfd.send('FAIL')
self.connfd.send(b'OK')
time.sleep(0.1)
for line in fd:
self.connfd.send(line)
fd.close()
sleep(0.1)
self.connfd.send(b'##')
print('文件发送成功')
return
def do_put(self,filename):
try:
fd = open(FILE_PATH+filename,'w')
except:
self.connfd.send('FAIL')
self.connfd.send(b'OK')
while True:
data = self.connfd.recv(1024).decode()
if data == '##':
break
fd.write(data)
fd.close()
print('接收文件完毕')
return
def main():
if len(sys.argv)<3:
print('argv is error')
sys.exit(1)
HOST = sys.argv[1]
PORT = int(sys.argv[2])
ADDR = (HOST,PORT)
BUFFERSIZE = 1024
sockfd = socket()
sockfd.bind(ADDR)
sockfd.listen(5)
signal.signal(signal.SIGCHLD,signal.SIG_IGN)
while True:
try:
connfd,addr = sockfd.accept()
except KeyboardInterrupt:
sockfd.close()
sys.exit(0)
except Exception:
continue
print('客户端登录 ',addr)
pid = os.fork()
if pid < 0:
print('创建子进程失败')
continue
elif pid == 0:
sockfd.close()
ftp = FtpServer(connfd)
while True:
#接收客户端请求
data = connfd.recv(BUFFERSIZE).decode()
if data[0] == 'L':
ftp.do_list()
elif data[0] == 'G':
filename = data.split(' ')[-1]
ftp.do_get(filename)
elif data[0] =='P':
filename = data.split(' ')[-1]
ftp.do_put(filename)
elif data[0] = 'Q':
print('客户端退出')
sys.exit(0)
else:
connfd.close()
continue
if __name__ == '__main__':
main()
client端
from socket import *
import sys
import time
class FtpClient(object):
"""docstring for FtpClient"""
def __init__(self, sockfd):
self.sockfd = sockfd
def do_list():
self.sockfd.send(b'L')#发送请求类型
#接收服务器确认 OK or Fail
data = self.sockfd.recv(1024).decode()
if data == 'OK':
while True:
data = self.sockfd.recv(1024).decode()
if data = '##':
break
print(data)
print('文件列表展示完毕')
return
else:
print('文件列表请求失败')
return
def do_get(self,filename):
self.sockfd.send(('G '+filename).encode())
data = self.sockfd.recv(1024).decode()
if data = 'OK':
fd= open(filename,'w')
while True:
data = self.sockfd.recv(1024).decode()
if data == '##':
break
fd.write(data)
fd.close()
else:
print('下载文件失败')
return
def do_put(self,filename):
try:
fd = open(filename,'rb')
except:
print('上传文件不存在')
return
self.sockfd.send(('P'+filename).encode())
data = self.sockfd.recv(1024).decode()
if data = 'OK':
for line in fd:
self.sockfd.send(line)
fd.close()
time.sleep(0.1)
self.sockfd.send(b'##')
print('上传文件完毕')
return
else:
print('上传文件失败')
return
def do_quit(self,filename):
self.sockfd.send(b'Q')
def main():
if len(sys.argv)!=3:
print('argv is error')
sys.exit(1)
HOST = sys.argv[1]
PORT = int(sys.argv[1])
ADDR = (HOST,PORT)
BUFFERSIZE = 1024
sockfd = socket()
sockfd.connect(ADDR)
ftp = FtpClient(sockfd)
#生产事件对象
while True:
print('************命令选项**********')
print('************list**********')
print('************get file**********')
print('************put file**********')
print('************quit**********')
data = input('输入命令》》')
if data == 'list':
ftp.do_list()
elif data =='get':
ftp.do_get()
elif data == 'put':
ftp.do_put()
elif data == 'quit':
ftp.do_quit()
sockfd.close()
sys.exit(0)
else:
print('请输入正确命令!!!')
if __name__ == '__main__':
main()