04-案例:文件下载器2
1.功能分析¶
- 实现根据文件名,下载文件内容
- 文件下载完成服务器端给予提示
- 下载的文件不存在,则提示错误
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()
文件下载器存在的问题:¶
多个客户端下载是同步的,必须是一个下载完成后,另外一个客户端才能连接下载