使用TCP协议进行文件传输,服务端使用多进程的demo
服务端:
import socket
import multiprocessing
import os
import time
import sys
# 文件存放路径
FILE_PATH = "F:\\编程学习\\python\\综合示例\\FTP文件管理\\服务端\\文件库"
# 文件库目录
file_list = os.listdir(FILE_PATH)
def fun(soc,addr):
while True:
request = soc.recv(1024).decode("utf-8")
# 断开连接
if request == "0":
print("%s已断开连接" % str(addr))
soc.close()
break
# 上传文件
elif request == "1":
# 上传文件前更新文件库目录
file_list = os.listdir(FILE_PATH)
while True:
name = soc.recv(1024).decode("utf8")
if name == "#":
break
if name in file_list:
soc.send("0".encode("utf-8"))
continue
else:
soc.send("1".encode("utf-8"))
path = FILE_PATH + "\\" + name
try:
file = open(path, "wb")
except:
print("存在异常")
else:
time.sleep(1)
# 将连接对象设置为非阻塞状态
soc.setblocking(False)
while True:
try :
# 此时接收缓存区为空时会抛出异常
data = soc.recv(10240)
except:
break
else:
file.write(data)
# 将连接对象改回阻塞状态
soc.setblocking(True)
# 每操作一次文件就更新一次文件库目录
file_list = os.listdir(FILE_PATH)
print("文件库已更新",file_list)
file.close()
break
# 下载文件
elif request == "2":
# 下载文件前更新文件库目录
file_list = os.listdir(FILE_PATH)
soc.send(str(file_list).encode())
while True:
name = soc.recv(1024).decode("utf-8")
if name == "#":
break
path = FILE_PATH + "\\" + name
try:
file = open(path, "rb")
except:
print("存在异常")
else:
while True:
data = file.read(10240)
if not data:
break
soc.send(data)
print("文件发送成功")
file.close()
break
# 函数执行结束后退出进程
sys.exit()
if __name__ == "__main__":
sock = socket.socket()
sock.bind(("0.0.0.0", 8888))
sock.listen(1)
while True:
soc,addr = sock.accept()
print("已连接客户端:%s" % str(addr))
# 每连接一个客户端就更新一次文件库
file_list = os.listdir(FILE_PATH)
# 为每一个客户端分配一个子进程
process = multiprocessing.Process(target=fun,args=(soc,addr),kwargs={})
process.daemon = True
process.start()
客户端:
import socket
import os
import time
FILE_PATH = "F:\\编程学习\\python\\综合示例\\FTP文件管理\\客户端\\文件\\"
file_list = os.listdir("F:\\编程学习\\python\\综合示例\\FTP文件管理\\客户端\\文件")
sock = socket.socket()
sock.connect(("127.0.0.1",8888))
while True:
request = input("请选择操作:0.断开连接;1.上传文件;2.下载文件\n")
# 断开连接
if request == "0":
sock.send("0".encode("utf-8"))
sock.close()
break
# 上传文件
elif request == "1":
sock.send("1".encode("utf-8"))
while True:
name = input("请输入文件名(包括文件扩展名):")
if name == "#":
sock.send("#".encode("utf-8"))
break
if name not in file_list:
print("文件不存在")
continue
sock.send(name.encode("utf-8"))
repeat = sock.recv(1024).decode("utf-8")
if repeat == "0":
print("文件名重复")
continue
path = FILE_PATH + name
try:
file = open(path, "rb")
except:
print("存在异常")
else:
while True:
data = file.read(10240)
if not data:
break
sock.send(data)
print("文件上传成功")
file.close()
break
# 下载文件
elif request == "2":
sock.send("2".encode("utf-8"))
menu = sock.recv(1024).decode("utf-8")
# 切片并转换为列表
menu = menu[2:-2].split("', '")
while True:
print("文件库目录:%s" % menu)
name = input("请输入下载文件名:")
if name == "#":
sock.send(name.encode("utf-8"))
break
if name not in menu:
print("文件不存在")
continue
sock.send(name.encode("utf-8"))
path = FILE_PATH + name
try:
file = open(path, "wb")
except:
print("存在异常")
else:
time.sleep(1)
# 将连接对象设置为非阻塞状态
sock.setblocking(False)
while True:
try:
# 此时接收缓存区为空时会抛出异常
data = sock.recv(10240)
except:
break
else:
file.write(data)
# 将连接对象改回阻塞状态
sock.setblocking(True)
print("文件下载成功")
file.close()
break
sock.close()