Python 实现 TCP上传下载文件智能系统

废话不多说, 直接上代码, 代码中有详解, 已在 ubuntu 中成功调试


TCP 客户端: 

import socket
import time


def header():
    print("*" * 50)
    print("欢迎使用文件传输系统".center(40))
    print("请选择您要进行的操作代码:\n1.服务器下载\n2.服务器上传\n3.退出系统")


def download_file(tcpOrder_socket):
    """从服务器上下载文件 """
    tcpOrder_socket.send(choice_num.encode("utf-8"))  # 给服务器下命令

    while True:
        # 睡眠1s 防止频繁请求带来异常
        time.sleep(1)
        # 获取要发送的信息
        file_name = input("请输入你要查找的文件名:")
        # 准备发送内容至服务器
        # time.sleep(1)
        tcpOrder_socket.send(file_name.encode("utf-8"))
        # 接收服务器反馈信息并限制字节数为1024
        recv_msg = tcpOrder_socket.recv(1024)

        # 此处需要标识唯一的字符去判断服务器有没有找到目标文件
        if recv_msg.decode("utf-8") == "No such file or directory":
            print("文件不存在")
            continue
        else:  # 如果收到了数据
            print(recv_msg.decode("utf-8"))
            print("downloading。。。。")
            # 更换电脑后需要更改地址
            with open(r"/home/python/Desktop/summer/%s" % file_name, "wb") as dowanload_file:
                dowanload_file.write(recv_msg)  # 覆盖写入
                print("download complete!")
                ask_again = input("是否继续下载?1/继续 0/退出")

        if ask_again == "1":
            tcpOrder_socket.send(ask_again.encode("utf-8"))

            continue
        elif ask_again == "0":
            # 向服务器发送本次下载停止命令
            tcpOrder_socket.send(ask_again.encode("utf-8"))
            tcpOrder_socket.close()
            break


def update_file(tcpOrder_socket):
    """上传文件到服务器, 且服务器会将文件保存在对应的路径上"""
    tcpOrder_socket.send(choice_num.encode("utf-8"))
    while True:

        updateFile_name = input("请输入你要上传的文件名")
        # tcpOrder_socket.send(updateFile_name.encode("utf-8"))
        # time.sleep(1)
        print("本地搜索中")
        # 捕捉异常  打开目标文件
        try:
            file_content = ""
            # 更换电脑后需要更改地址
            souce_file = open(r"/home/python/Desktop/summer/%s" % updateFile_name, "r")

            tcpOrder_socket.send(updateFile_name.encode("utf-8"))
            time.sleep(1)
            file_content = souce_file.read()

        except Exception as fault_info:
            # print(fault_info)
            print("文件不存在")
            # 此处需要给服务器发送文件不存在命令
            # tcpOrder_socket.send("No such file or directory".encode("utf-8"))

            continue
        if not updateFile_name:
            continue
            # tcpOrder_socket.close()
        elif file_content:
            # 将内容发送给客户端
            tcpOrder_socket.send(file_content.encode("utf-8"))
            print("上传完成!")
            # 再次接收客户端命令
            ask_again = input("是否继续上传?1/继续 0/退出")
        if ask_again == "0":
            # 向服务器发送本次下载停止命令
            tcpOrder_socket.send(ask_again.encode("utf-8"))
            tcpOrder_socket.close()
            break
        else:
            # 即使命令出错也当作再次进行上传任务
            tcpOrder_socket.send("1".encode("utf-8"))
            continue

server_ip = ""
server_port = ""

while True:
    server_ip = input("请输入服务器IP:")
    server_port = input("请输入服务器Port:")
    while True:
        header()
        # 创建套接字对象
        try:  # 抓取OSError: [Errno 99] Cannot assign requested address  异常
            tcpOrder_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            # 强制允许端口复用
            tcpOrder_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            locall_addr = ("", 7890)
            # 绑定本地信息
            tcpOrder_socket.bind(locall_addr)
            # print(tcpOrder_socket)
            tcpOrder_socket.connect((server_ip, int(server_port)))
            choice_num = input("请输入操作代码:")
        except Exception as link_fault:
            continue
        # 下载模式
        if choice_num == "1":

            # 调用下载函数
            download_file(tcpOrder_socket)
        # 上传模式
        elif choice_num == "2":
            # 调用上传函数
            update_file(tcpOrder_socket)

        elif choice_num == "3":
            print("system quit!")
            tcpOrder_socket.close()
            break
        else:
            print("请输入正确操作代码")

TCP 服务器端:

import socket
import os
tcpTemp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定本地信息端口 #强制允许端口复用
tcpTemp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
locall_addr = ("", 7880)
tcpTemp_socket.bind(locall_addr)
# 配置监听listen
tcpTemp_socket.listen(128)


while True:
    # 进入接收数据状态(涉及到解包)返回客户端ip及端口信息
    print("等待下载服务中....")
    newtcpServer_socket, newclient_addr = tcpTemp_socket.accept()
    tcp_order = newtcpServer_socket.recv(1024).decode("utf-8")

    if tcp_order == "1":
        while True:
            # print("下载模式")
            print("欢迎使用智能文件下载系统")
            # 接收数据并限制字节
            recv_filename = newtcpServer_socket.recv(1024).decode("utf-8")
            if recv_filename == "":
                continue
            # 打印用户需求
            print("该客户要下载的文件是:%s" % recv_filename)
            print("搜索中....")

            file_content = ""
            try:
                # 搜索文件名 并打开  更换电脑后需要更改地址
                souce_file = open(r"/home/python/Desktop/%s" % recv_filename, "r")
                # 读取文件内容并临时保存
                file_content = souce_file.read()
            except Exception as fault_info:
                print(fault_info)
                print("文件不存在")
                # 此处需要给客户端发送文件不存在命令
                newtcpServer_socket.send("No such file or directory".encode("utf-8"))

            if not recv_filename:
                newtcpServer_socket.close()
            if file_content:
                # 将内容发送给客户端
                newtcpServer_socket.send(file_content.encode("utf-8"))
                print("下载完成!")
                # 再次接收客户端命令
                recv_order = newtcpServer_socket.recv(1024).decode("utf-8")
                if recv_order == "0":  # 退出本次下载请求
                    newtcpServer_socket.close()
                    break
                elif recv_order == "1":  # 继续
                    continue

    elif tcp_order == "2":
        print("上传模式")
        while True:
            # print("下载模式")
            print("欢迎使用智能文件上传系统")

            # 接收文件名
            recv_filename = newtcpServer_socket.recv(1024).decode("utf-8")
            if recv_filename == "":
                continue
            # 打印用户上传文件名
            print("该客户要上传的文件是:%s" % recv_filename)
            # print("搜索中....")

            # file_content = ""

            file_content = newtcpServer_socket.recv(1024)

            # if file_content.decode("utf-8")=="No such file or directory":
            #     print("上传失败")
            #     #与客户端同步 从头开始
            #     continue

            # 新建文件保存数据  更换电脑后需要更改地址
            with open(r"/home/python/Desktop/%s" % recv_filename, "wb") as update_file:

                update_file.write(file_content)  # 覆盖写入
                print("update complete!")
            # 接收再次上传命令
            recv_order = newtcpServer_socket.recv(1024).decode("utf-8")
            if recv_order == "0":  # 退出本次上传请求
                newtcpServer_socket.close()
                break
            elif recv_order == "1":  # 继续
                continue

 

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值