Python文件传输demo

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值