1 import os
2
3 import time
4 from mylib import *
5 import socket
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 # 用于处理任务状态的工具类
22 class LogTool:
23 # 日志记录的文件名称
24 log_file = "file_log.txt"
25 # 初始化方法
26 def __init__(self):
27 #创建 记录文件
28 if not os.path.exists(self.log_file):
29 self.write_info({})
30
31 # 用于获取文件状态的方法
32 def get_file_status(self,filename):
33 """
34 :param filename:
35 :return: 1 表示完成 0 已存在但表示未完成 2 新任务 3 文件被删除
36 """
37 # 先找任务记录看看
38 info = self.read_info()
39 if filename in info: #存在记录
40 if info[filename]:
41 # 记录显示为True 在判断文件是否已经存在
42 if os.path.exists(os.path.join("clientFiles",filename)):
43 return 1
44 else:
45 return 3
46 else:
47 return 0
48 else:# 不存在记录
49 return 2
50
51 def read_info(self):
52 with open(self.log_file,"rt") as f:
53 return json.load(f)
54
55 def write_info(self,info):
56 with open(self.log_file,"wt") as f:
57 json.dump(info,f)
58
59 # 添加新的新记录
60 def newtask(self,filename):
61 info = self.read_info()
62 info[filename] = False
63 self.write_info(info)
64
65 #标记为任务完成
66 def task_done(self, filename):
67 info = self.read_info()
68 info[filename] = True
69 self.write_info(info)
70
71
72 # =======================================TCP 部分
73
74
75
76
77
78 # 输入文件名称
79 filename = input("filename:").strip()
80
81 # 创建小工具
82 tool = LogTool()
83
84 # 获取任务的状态
85 st = tool.get_file_status(filename)
86 # " :return: 1 表示完成 0 已存在但表示未完成 2 新任务 3 文件被删除"
87
88 # 表示已经下载的大小
89 recv_size = 0
90
91 if st == 0:
92 # 要断点续传 要读取文件大小发给服务器
93 recv_size = os.path.getsize(os.path.join("clientFiles",filename))
94 elif st == 1:
95 print("该任务已经完成!")
96 exit()
97 elif st == 2:
98 print("新任务")
99 else:
100 if input("文件被删除!是否重新下载?(y/n)") != "y":
101 exit()
102
103 # 信息中要包含已接受文件大小
104 info = {"filename":filename,"recv_size":recv_size}
105
106
107 client = socket.socket()
108 client.connect(("127.0.0.1",1688))
109
110 # 发送报头信息
111 send_rep(client,info)
112
113 # 接收报头信息
114 rep = recv_head(client)
115
116
117 # 判断是文件信息还是错误信息
118 if "filename" in rep:
119 # 拼接文件路径
120 path = os.path.join("clientFiles", rep["filename"])
121
122
123 buff_size = 2048
124
125 # 添加下载记录
126 tool.newtask(filename)
127
128 # 注意 必须使用ab模式 才能断点续传
129 with open(path,"ab") as f:
130 while recv_size < rep["filesize"]:
131 if buff_size < rep["filesize"] - recv_size:
132 data = client.recv(buff_size)
133 else:
134 data = client.recv(rep["filesize"] - recv_size)
135 f.write(data)
136 recv_size += len(data)
137 # print(recv_size/rep["filesize"])
138
139 # 标记完成
140 tool.task_done(filename)
141
142 else:
143 print("error")
144 print(rep)
145
146
147
148
149
150
151
152 # 发送文件报头