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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要搭建一个FTP服务器,你可以使用Python的`pyftpdlib`库。下面是一个简单的示例代码: ```python from pyftpdlib.authorizers import DummyAuthorizer from pyftpdlib.handlers import FTPHandler from pyftpdlib.servers import FTPServer # 创建一个虚拟用户并指定路径和权限 authorizer = DummyAuthorizer() authorizer.add_user("username", "password", "/path/to/directory", perm="elradfmw") # 所有用户都具有相同的权限 # authorizer.add_anonymous("/path/to/directory") # 创建FTP处理程序并绑定作者 handler = FTPHandler handler.authorizer = authorizer # 监听地址和端口 server = FTPServer(("0.0.0.0", 21), handler) # 开始FTP服务器 server.serve_forever() ``` 在代码中,我们首先导入`pyftpdlib`库的需要的类。然后,我们创建一个`DummyAuthorizer`对象,用于管理FTP用户和权限。使用`add_user()`方法添加一个虚拟用户,指定用户名、密码、用户目录和权限。你也可以使用`add_anonymous()`方法添加匿名用户。 接下来,我们创建一个`FTPHandler`对象,并将`DummyAuthorizer`对象绑定到处理程序。然后,我们指定服务器的监听地址和端口号,创建一个`FTPServer`对象,并将监听地址和处理程序传递给它。 最后,我们调用`serve_forever()`方法开始运行FTP服务器。 请注意,这只是一个简单的示例,实际的FTP服务器可能需要更多的配置和安全性措施。你可以根据实际需求进行详细的配置和定制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值