高效解决文件传输问题,支持普通文件和文件夹的传输
####通信协议设计
- 基于TCP协议,服务器默认端口号为9999;
- 客户端连接服务器成功后,客户端不发送任何消息,服务器端以文件为单位将所有数据依次发送给客户端,在发送单个文件时,首先将该文件的描述信息(定长包头,长度为347B)发送给客户端,紧接着发送文件数据给客户端,这样就完成了一个文件的发送,当发送完所有文件数据后就断开连接;
- 文件描述信息结构为:文件名(300B,右边填充空格,UTF-8编码,如果发送的是一个普通文件,该字段的值为其文件名,如果发送的是一个文件夹,该字段的值为文件的相对路径,即相对要发送的文件夹的路径,没有斜线前缀) + 文件大小(15B,右边填充空格,如果为空文件夹,该字段的值为-1) + 文件MD5值(32B,大写形式,如果是空文件夹,该字段的值为32个空格)
客户端:
import socket
import sys
import os
import hashlib
import time
import progressbar
# 引入一个md5值
def get_file_md5(file_path):
m = hashlib.md5()
# 文件遍历
with open(file_path, "rb") as f:
while True:
data = f.read(1024)
if len(data) == 0:
break