04-案例:文件下载器

1.1 功能分析

image-20180629151232615

1.2 实现效果

download-file

阶段功能:客户端发送要下载的文件名,服务器能够正常接收到文件名(未进行文件数据发送)

1.3 实现步骤

客户端实现思路

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

服务端实现思路

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

1.4 代码实现

客户端 参考代码如下:

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


# 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()
    # 9、关闭和客户端的连接
    new_client_socket.close()
# 10、关闭服务器
tcp_server_socket.close()