Python 项目一 FTP服务器

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()

猜你喜欢

转载自blog.csdn.net/weixin_38246633/article/details/81773352