day8 socket大文件传输

一、概述

我们如何利用socket去下载一个文件,整体思路是这样的:

  1. 读取文件名
  2. 检测文件是否存在
  3. 打开文件
  4. 检测文件大小
  5. 发送文件大小给客户端
  6. 等客户确认
  7. 开始边读边发数据
  8. 发送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()

 

posted @ 2018-03-14 14:51  东郭仔  阅读(134)  评论(0)    收藏  举报