day8 socket大文件传输
一、概述
我们如何利用socket去下载一个文件,整体思路是这样的:
- 读取文件名
- 检测文件是否存在
- 打开文件
- 检测文件大小
- 发送文件大小给客户端
- 等客户确认
- 开始边读边发数据
- 发送md5值给客户端校验
友情提示:以下代码都是在Linux系统,并且是python3换将下实验的。
服务器:
1 import hashlib 2 import socket,os 3 4 server=socket.socket() 5 server.bind(("localhost",9000)) 6 server.listen() 7 8 while True: 9 conn,addr=server.accept() 10 print("new conn",addr) 11 while True: 12 print("等待新指令") 13 data=conn.recv(2048) 14 if not data: 15 print("客户端已断开") 16 break 17 18 cmd,filename=data.decode().split() 19 print(filename) 20 #m=hashlib.md5() 21 if os.path.isfile(filename): 22 with open(filename,"rb") as f: 23 file_size = os.stat(filename).st_size 24 conn.send(str(file_size).encode()) 25 conn.recv(2048) 26 for line in f: 27 #m.update(line) 28 conn.send(line) 29 #conn.send(m.hexdigest) 30 31 else: 32 print("没有这个文件") 33 res="没有这个文件" 34 conn.send(res.encode()) 35 print("send done") 36 server.close()
客户端:
1 import socket,os,hashlib 2 3 client=socket.socket() 4 client.connect(("localhost",9000)) 5 6 while True: 7 cmd = input(">>>:").strip() 8 if len(cmd) == 0: continue 9 if cmd.startswith("get"): 10 client.send(cmd.encode()) 11 server_respose = client.recv(2048) 12 print("server respose:",server_respose) 13 file_total_size=int(server_respose.decode()) 14 revived_size = 0 15 filename=cmd.split()[1] 16 if os.path.isfile(filename): 17 filename=filename+".new" 18 with open(filename,"wb") as f: 19 while revived_size < file_total_size: 20 data = client.recv(2048) 21 revived_size+=len(data) 22 f.write(data) 23 else: 24 print(file_total_size,revived_size) 25 print("file recv done") 26 27 client.close()

浙公网安备 33010602011771号