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)