Python模拟FTP文件服务器的操作方法

分为服务端和客户端,要求可以有多个客户端同时操作。

客户端可以查看服务器文件库中有什么文件。
客户端可以从文件库中下载文件到本地。
客户端可以上传一个本地文件到文件库。
使用print在客户端打印命令输入提示,引导操作

服务端

# 导入相关模块
from socket import *
from multiprocessing import Process
import signal, os, time
# 绑定IP地址
IP = "127.0.0.1"
# 绑定端口
PORT = 8888
ADDR = (IP, PORT)
# 绑定服务器的指定目录
DIR = "/home/max/ftp"
# 处理查看文件请求
def browse(c):
  # 列表方式查看文件
  list = os.listdir("%s" % DIR)
  # 按通信协议格式组织数据
  msg = "B " + ";".join(list)
  # 发送到客户端
  c.send(msg.encode())
# 处理客户端下载文件请求
def download(c, file):
  # 判断文件是否存在且是否是文件
  if file in os.listdir(DIR) and os.path.isfile("%s/%s" % (DIR, file)):
    # 打开文件
    f = open("%s/%s" % (DIR, file), "rb")
    # 发送下载代码,告知客户端进入"D"
    c.send(("D %s " % file).encode())
    # 等待客户端先进入"D"模式下的recv阻塞函数
    time.sleep(0.1)
    # 循环发送文件
    while True:
      data = f.read(1000)
      if not data:
        # 设置间隔,等待文件传输完整
        time.sleep(0.1)
        # 约定的信息让客户端退出接收循环
        c.send(b"finished")
        break
      c.send(data)
    f.close()
  # 否则按协议格式发送错误代码
  else:
    c.send(b"D fileerror ")
# 处理客户端上传文件请求
def upload(c, file):
  # 创建文件
  f = open("%s/%s" % (DIR, file), "wb")
  # 循环接收文件
  while True:
    data = c.recv(1024)
    # 收到约定的信息退出循环
    if data == b"finished":
      break
    f.write(data)
  f.close()
# 处理客户端退出请求
def login_out(c):
  # 按协议格式组织信息
  msg = "O closed "
  # 发给客户端的recv_msg进程
  c.send(msg.encode())
def deal(c):
  # 发送代码告知客户端连接成功
  c.send(b"K ")
  while True:
    # 循环接收客户端请求,约定通信协议为"* ** ****"格式
    msg = c.recv(1024)
    # 如果客户端崩了,解除该子进程
    if not msg:
      break
    # 解析请求
    req = msg.decode().split(" ", 2)
    # 处理查看文件请求,跳入browse函数
    if req[0] == "B":
      browse(c)
    # 处理客户端下载文件请求,跳入download函数
    elif req[0] == "D":
      download(c, req[1])
    # 处理客户端上传文件请求,跳入upload函数
    elif req[0] == "U":
      upload(c, req[1])
    # 处理客户端退出请求,跳入login_out函数
    elif req[0] == "O":
      login_out(c)
      # 跳出循环,结束子进程
      break
# 主程序,父进程用于接收客户端请求并循环创建子进程,子程序处理请求
def main():
 # 创建tcp套接字
 s = socket()
 # 绑定服务器地址
 s.bind(ADDR)
 # 设置监听套接字
 s.listen()
 # 处理僵尸进程
 signal.signal(signal.SIGCHLD, signal.SIG_IGN)
  while True:
    # 连接客户端
    c, addr = s.accept()
    # 创建子进程,用以处理客户端请求,跳入deal函数
    p = Process(target=deal, args=(c,))
    # 子程序开始执行
    p.start()
if __name__ == '__main__':
  main()

客户端

# 导入相关模块
from socket import *
import os, sys, time
# 绑定服务端IP地址
IP = "127.0.0.1"
# 绑定服务端端口
PORT = 8888
ADDR = (IP, PORT)
# 收到约定的信息退出循环
# 发送消息进程
def send_msg(s):
  # 等待接收进程先运行到"K"分支
  time.sleep(0.1)
  while True:
    try:
      # 输入指令
      data = input(">>>")
    except:
      # 客户端错误,向服务端发送O
      data = "O"
    if data == "B": # 查看目录
      msg = "B "
      s.send(msg.encode())
    elif data == "D": # 下载文件
      # 输入想要下载的文件
      want = input("download ? file:")
      msg = "D %s " % want
      s.send(msg.encode())
    elif data == "U": # 上传文件
      file = input("upload ? file:")
      # 判断文件是否在客户端文件所在的目录且是文件
      if file in os.listdir(os.getcwd()) and os.path.isfile("%s/%s" % (os.getcwd(), file)):
        msg = "U %s " % file
        s.send(msg.encode())
        f = open("%s" % file, "rb")
        # 等待服务端进入upload的recv阻塞函数
        time.sleep(0.1)
        while True:
          data = f.read(1000)
          if not data:
            # 设置间隔,等待文件传输完整
            time.sleep(0.1)
            # 约定的信息让客户端退出接收循环
            s.send(b"finished")
            break
          s.send(data)
        f.close()
        print("upload succussfully")
      # 否则按协议格式显示错误代码
      else:
        print("file not exist\ninput BDUO to forward\n", end="")
    elif data == "O": # 断开连接
      msg = "O "
      s.send(msg.encode())
      sys.exit()
    # 指令错误
    else:
      print("input error")

# 接收消息进程
def recv_msg(s):
  while True:
    data = s.recv(1024)
    # 解析数据
    msg = data.decode().split(" ", 2)
    if msg[0] == "K": # 登录成功反馈
      print(
        "login in successfully\ninput B to browse,D to download,U to upload,O to login out")
    elif msg[0] == "B": # 查看目录反馈
      # 如果文件库不为空
      if msg[2]:
        print("files:", msg[2], "\n>>>", end="")
      else:
        print("files: no files", "\n>>>", end="")
    elif msg[0] == "D":
      # 服务端文件不存在
      if msg[1] == "fileerror":
        print("file not exist\ninput BDUO to forward\n>>>", end="")
        continue
      # 服务端文件存在
      else:
        f = open("%s" % msg[1], "wb")
        while True:
          data = s.recv(1024)
          # 收到约定的信息退出循环
          if data == b"finished":
            break
          f.write(data)
        f.close()
        print("download successfully\n>>>", end="")
    elif msg[0] == "O": # 收到来自发送消息进程发送到服务端的断开请求
      # 进程退出并打印提示
      sys.exit("login out successfully")

# 主程序
def main():
  # 创建tcp套接字
  s = socket()
  # 连接服务端
  s.connect(ADDR)
  # 创建多进程,子进程用于发送消息,父进程用于接收消息
  pid = os.fork()
  if pid < 0:
    print("system error")
  # 子进程
  elif pid == 0:
    send_msg(s)
  # 父进程
  else:
    recv_msg(s)
if __name__ == '__main__':
  main()

总结

以上所述是小编给大家介绍的Python_模拟FTP文件服务器的操作方法,希望对大家有所帮助,也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • python实现从ftp服务器下载文件的方法

    本文实例讲述了python实现从ftp服务器下载文件的方法.分享给大家供大家参考.具体实现方法如下: import ftplib ftp = ftblib.FTP("ftp.yourServer.com") ftp.login("username","password") filename = "index.html" ftp.storlines("STOR "+filename,open(filename

  • Python搭建FTP服务器的方法示例

    Python版本 3.6.2 使用的ftp包:pyftpdlib    pip install pyftpdlib就可以下载安装了 FTP协议下载上传文件在文件过大的情况下会比HTTP更具有优势,更为方便的实现断点上传和进度监控,下面是官方文档中的 基本方法 import os from pyftpdlib.authorizers import DummyAuthorizer from pyftpdlib.handlers import FTPHandler from pyftpdlib.ser

  • 400多行Python代码实现了一个FTP服务器

    Python版本 实现了比之前的xxftp更多更完善的功能 1.继续支持多用户 2.继续支持虚拟目录 3.增加支持用户根目录以及映射虚拟目录的权限设置 4.增加支持限制用户根目录或者虚拟目录的空间大小 xxftp的特点 1.开源.跨平台 2.简单.易用 3.不需要数据库 4.可扩展性超强 5.你可以免费使用xxftp假设自己的私人FTP服务器 测试地址 ftp://xiaoxia.org 匿名帐号可以使用! 匿名根目录只读,映射了一个虚拟目录,可以上传文件但不允许更改! 使用方法 跟之前用C语言

  • python实现FTP服务器服务的方法

    FTP服务的主动模式和被动模式 在开始之前,先聊一下FTP的主动模式和被动模式,两者的区别 , 用两张图来表示可能会更加清晰一些: 主动模式: 主动模式工作过程: 1. 客户端以随机非特权端口N,就是大于1024的端口,对server端21端口发起连接 2. 客户端开始监听 N+1端口: 3. 服务端会主动以20端口连接到客户端的N+1端口. 主动模式的优点: 服务端配置简单,利于服务器安全管理,服务器只需要开放21端口 主动模式的缺点: 如果客户端开启了防火墙,或客户端处于内网(NAT网关之后

  • python连接远程ftp服务器并列出目录下文件的方法

    本文实例讲述了python连接远程ftp服务器并列出目录下文件的方法.分享给大家供大家参考.具体如下: 这段python代码用到了pysftp模块,使用sftp协议,对数据进行加密传输 import pysftp srv = pysftp.Connection(host="your_FTP_server", username="your_username",password="your_password") # Get the directory

  • Python搭建HTTP服务器和FTP服务器

    本教程为大家分享了Python搭建HTTP服务器和FTP服务器的具体步骤,供大家参考,具体内容如下 默认安装版本为pytho2.7 http服务器搭建教程: 进入要开放访问的目录下,执行命令:python -m SimpleHTTPServer 9000 显示上述表示安装成功,且http服务的端口为:9000,不跟端口默认80端口 通过浏览器访问该http服务: http://localhost:9000 页面显示入下: 服务器端显示如下: 表示接收请求成功. 下面是ftp服务器搭建教程: py

  • Python实现基于多线程、多用户的FTP服务器与客户端功能完整实例

    本文实例讲述了Python实现基于多线程.多用户的FTP服务器与客户端功能.分享给大家供大家参考,具体如下: 项目介绍: 1. 用户加密认证 2. 允许同时多用户登录 3. 每个用户有自己的家目录 ,且只能访问自己的家目录 4. 对用户进行磁盘配额,每个用户的可用空间不同 5. 允许用户在ftp server上随意切换目录 6. 允许用户查看当前目录下文件 7. 允许上传和下载文件,保证文件一致性 8. 文件传输过程中显示进度条 实现的原理: 服务器端启用端口监听,并对每一连接启用一个线程,对用

  • Python模拟FTP文件服务器的操作方法

    分为服务端和客户端,要求可以有多个客户端同时操作. 客户端可以查看服务器文件库中有什么文件. 客户端可以从文件库中下载文件到本地. 客户端可以上传一个本地文件到文件库. 使用print在客户端打印命令输入提示,引导操作 服务端 # 导入相关模块 from socket import * from multiprocessing import Process import signal, os, time # 绑定IP地址 IP = "127.0.0.1" # 绑定端口 PORT = 8

  • Python 模拟员工信息数据库操作的实例

    1.功能简介 此程序模拟员工信息数据库操作,按照语法输入指令即能实现员工信息的增.删.改.查功能. 2.实现方法 • 架构: 本程序采用python语言编写,关键在于指令的解析和执行:其中指令解析主要运用了正则表达式来高效匹配有效信息:指令执行通过一个commd_exe主执行函数和增.删.改.查4个子执行函数来实现,操作方法主要是运用面向对象方法将员工信息对象化,从而使各项操作都能方便高效实现.程序主要函数如下: (1)command_exe(command) 指令执行主函数,根据指令第一个字段

  • Python对FTP交互封装的实现

    目录 使用工具: ftp登录脚本 pexpect组件简介 1. spawn类 2. run函数 使用工具: pexpect库 pexpect可以理解为Linux下expect(不知道的可以百度下linux expect)的python封装.通过pexpect可以实现对ssh.ftp.passwd.telnet等命令进行自动交互,而无需人工干涉来达到自动化的目的.比如我们可以模拟一个FTP登录时的所有交互,包括输入主机地址.用户名.密码,还有对文件上传下载操作等等,若出现异常,我们也可以进行自动化

  • Python 模拟购物车的实例讲解

    1.功能简介 此程序模拟用户登陆商城后购买商品操作.可实现用户登陆.商品购买.历史消费记查询.余额和消费信息更新等功能.首次登陆输入初始账户资金,后续登陆则从文件获取上次消费后的余额,每次购买商品后会扣除相应金额并更新余额信息,退出时也会将余额和消费记录更新到文件以备后续查询. 2.实现方法 架构: 本程序采用python语言编写,将各项任务进行分解并定义对应的函数来处理,从而使程序结构清晰明了.主要编写了六个函数: (1)login(name,password) 用户登陆函数,实现用户名和密码

  • Python模拟登录12306的方法

    本文实例讲述了Python模拟登录12306的方法.分享给大家供大家参考. 具体实现方法如下: 复制代码 代码如下: #!/usr/bin/python # -*- coding: utf-8 -*-   import re; import sys; import cookielib; import urllib; import urllib2; import optparse; import json; import httplib2; reload(sys) sys.setdefaulten

  • 利用python模拟实现POST请求提交图片的方法

    本文主要给大家介绍的是关于利用python模拟实现POST请求提交图片的方法,分享出来供大家参考学习,下面来一看看详细的介绍: 使用requests来模拟HTTP请求本来是一件非常轻松的事情,比如上传图片来说,简单的几行代码即可: import requests files = {'attachment_file': ('1.png', open('1.png', 'rb'), 'image/png', {})} values = {'next':"http://www.xxxx.com/xxx

  • php实现curl模拟ftp上传的方法

    本文实例讲述了php实现curl模拟ftp上传的方法.分享给大家供大家参考.具体如下: <?php function upload($dir,$src,$dest) { $ch = curl_init(); $fp = fopen($src, 'r'); curl_setopt($ch, CURLOPT_URL, 'ftp://user:pwd@host/interpretation/'.$dir .'/'. $dest); curl_setopt($ch, CURLOPT_UPLOAD, 1)

  • python查看FTP是否能连接成功的方法

    本文实例讲述了python查看FTP是否能连接成功的方法.分享给大家供大家参考.具体如下: #!/usr/local/bin/python #-*- coding: UTF-8 -*- #################################################################### # python 查看FTP是否能连接成功 ##################################################################

  • 详解Python 模拟实现生产者消费者模式的实例

    详解Python 模拟实现生产者消费者模式的实例 散仙使用python3.4模拟实现的一个生产者与消费者的例子,用到的知识有线程,队列,循环等,源码如下: Python代码 import queue import time import threading import random q=queue.Queue(5) #生产者 def pr(): name=threading.current_thread().getName() print(name+"线程启动......") for

  • 利用python模拟sql语句对员工表格进行增删改查

    本文主要给大家介绍了关于python模拟sql语句对员工表格进行增删改查的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍: 具体需求: 员工信息表程序,实现增删改查操作: 可进行模糊查询,语法支持下面3种: select name,age from staff_data where age > 22                  多个查询参数name,age 用','分割 select * from staff_data where dept = 人事 select * from

随机推荐