MegaMU个人站

欢迎光临

落日黄沙 白帆秋水 你可知谁的记忆在时空里飞?


项目:文件下载器

目录

目标

服务器根据客户端发来的信息向客户端发送指定文件

思路

客户端向服务器发送要下载的文件名 服务器在当前文件夹寻找所需文件 分次发送文件的每一个部分 客户端接受文件的每一个部分 组合成完整的文件,解码 将文件储存到指定目录

实现

使用TCP协议,服务器与客户端分别构造。 信息发送时都是以二进制格式发送,可以在文件打开时就选择以二进制读取,省去解码的麻烦。 文件分批发送。服务器和客户端都要判断文件是否接受/读取完。

服务器

# 1、导入模块
import socket
# 2、创建套接字
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置套接字地址可以重用
# tcp_server_socket.setsockopt(当前套接字, 属性名, 属性值)
# socket.SO_REUSEADDR  地址是否可以重用   True可以重用  False 不可以重用
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 3、绑定端口
tcp_server_socket.bind(("", 8081))
# 4、设置监听
tcp_server_socket.listen(128)
# 5、接受客户端连接
while True:
    new_client_socket, ip_port = tcp_server_socket.accept()
    print("客户端", ip_port[0],"端口",ip_port[1],"已连接")
    # 6、接收客户端发送的文件名
    recv_data = new_client_socket.recv(1024)
    file_name = recv_data.decode()
    print(file_name)
	# 文件不存在时提示文件无法下载
    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 Exception as e:
        print("文件%s下载失败!" % file_name)
    else:
        print("文件%s下载成功" % file_name)
    # 9、关闭和当前客户端的连接
    new_client_socket.close()
# 10、关闭服务器
tcp_server_socket.close()

客户端

# 1、导入模块
import socket
# 2、创建套接字
tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 3、连接服务器
tcp_client_socket.connect(("000.000.000.000", 8081))
# 4、接收用户输入的文件名
file_name = input("请输入要下载的文件名:")
# 5、发送文件名到服务端
tcp_client_socket.send(file_name.encode())
# 6、创建文件,保存服务器传来的信息
try:
    # 创建文件并用二进制写入
	with open("/home/sirmegamu/Desktop/"+file_name, "wb") as file:
 	   # 7、接收并保存服务端发送的数据(循环)
 	   while True:
 	       file_data = tcp_client_socket.recv(1024)
 	       # 判断数据是否传送完毕
  	      if file_data:
  	          file.write(file_data)
  	      else:
   	         break
except:
    print("保存错误!")
# 8、关闭套接字
tcp_client_socket.close()

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦