04-案例:文件下载器2

1.功能分析

  1. 实现根据文件名,下载文件内容
  2. 文件下载完成服务器端给予提示
  3. 下载的文件不存在,则提示错误

2.代码实现

客户端 参考代码如下:

import socket
"""
    客户端实现思路
    1、导入模块
    2、创建套接字
    3、建立和服务器的连接
    4、接收用户输入的文件名
    5、发送文件名到服务器端
    6、创建文件,准备接收服务端返回的文件数据
    7、保存文件数据
    8、关闭套接字

"""

# 1、导入模块

# 2、创建套接字
tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 3、建立和服务器的连接
tcp_client_socket.connect(("192.168.31.122", 8080))
# 4、接收用户输入的文件名
file_name = input("请输入文件名:\n")
# 5、发送文件名到服务器端
tcp_client_socket.send(file_name.encode())
# 6、创建文件,准备接收服务端返回的文件数据
#          /home/teacher/PycharmProject/python11/day05/1.txt
#                  |
#                 下载
#                  |
#          /home/teacher/桌面/1.txt

with open("/home/teacher/桌面/"+file_name, "wb") as file:
# 7、保存文件数据
    while True:
        recv_data = tcp_client_socket.recv(1024)
        # 判断文件是否发送完成,服务器端传输完成后,recv_data 为空
        if recv_data:
            file.write(recv_data)
        else:
            break
# 8、关闭套接字
tcp_client_socket.close()

服务器 参考代码如下:

import socket
"""
    服务端书写思路
    1、导入模块
    2、创建套接字
    3、绑定地址和端口
    4、开始监听,设置套接字为被动监听模式
    5、等待客户端连接(如果有新客户端连接,会创建新的套接字)
    6、接收客户端发来的文件名
    7、根据文件名读取文件数据
    8、把读取的文件数据发送给客户端(循环)
    9、关闭和客户端的连接
    10、关闭服务器

"""

# 1、导入模块
# 2、创建套接字
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# setsockopt 设置套接字的属性的方法
# .setsockopt(那个级别的套接字,属性名,属性值 )
# socket.SOL_SOCKET 当前套接字
# socket.SO_REUSEADD 设置地址重用  True 可以重用  False 不能重用
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 3、绑定地址和端口
tcp_server_socket.bind(("", 8080))
# 4、开始监听,设置套接字为被动监听模式
tcp_server_socket.listen(128)

while True:
    # 5、等待客户端连接(如果有新客户端连接,会创建新的套接字)
    new_client_socket, ip_port = tcp_server_socket.accept()
    print(ip_port)
    # 6、接收客户端发来的文件名
    recv_data = new_client_socket.recv(1024)
    file_name = recv_data.decode()

    try:
        # 7、根据文件名读取文件数据
        with open(file_name, "rb") as file:
            # 8、把读取的文件数据发送给客户端(循环)
            while True:
                file_data = file.read(1024)

                if file_data:
                    new_client_socket.send(file_data)
                else:
                    break
    except:
        print("文件 %s 下载出错" % file_name)
    else:
        print("文件 %s 下载成功!" % file_name)

    # 9、关闭和客户端的连接
    new_client_socket.close()
# 10、关闭服务器
tcp_server_socket.close()

文件下载器存在的问题:

多个客户端下载是同步的,必须是一个下载完成后,另外一个客户端才能连接下载