- server:
- #!/usr/bin/python
- #coding:utf-8
- import socket,os
- import hashlib
- server = socket.socket()
- server.bind(('localhost',9999))
- server.listen(5)
- while True:
- conn,addr = server.accept() #等待 client 连接进来
- print('new conn:',addr)
- while True:
- print('等待新指令')
- data = conn.recv(1024) #接受 client 的信息
- if not data:
- print('客户端没有发送数据, 断开了')
- break
- cmd,filename = data.decode().split()
- print(filename)# client --get 文件名字 (tetst.txt)
- if os.path.isfile(filename):# 判断本地目录有这个文件
- f = open(filename,'rb')
- m = hashlib.md5()# 获取 md5 的实例
- file_size = os.stat(filename).st_size #这个是 int 数字.
- conn.send(str(file_size).encode('utf-8'))# 发送要下载的文件大小字节
- conn.recv(1024)# 等待接受 ack 回应
- for line in f:
- m.update(line)# 生成 md5
- conn.send(line)# 发送一行数据给 client
- print('MD5 验证码是:',m.hexdigest())
- f.close()
- conn.send(m.hexdigest().encode())# 发送 md5 给 client
- print('发送结束')
- server.close()
- clent:
- #!/usr/bin/python
- #coding:utf-8
- import socket,os
- import hashlib
- client = socket.socket()# 声明一个 socket 类型, 同时生成对象
- client.connect(('localhost',9999))
- while True:
- cmd = input('client>>:').strip()# 输入下载的 get xxx.tt
- if len(cmd) == 0:continue #输入空, 就重新输入
- if cmd.startswith('get'):#cmd 开始是 get 开头
- client.send(cmd.encode('utf-8')) #把文件名发送给 server 端
- server_response = client.recv(1024)# 接受要下载的文件总大小
- print('要下载文件总大小是:',server_response.decode())
- client.send('确认 ack, 开始接受数据下载'.encode())
- file_total_size = int(server_response.decode())# 文件大小字符串转成 int
- recesize = 0
- filename = cmd.split()[1]# 获取输入的文件名字
- print('文件名字是',filename)
- f =open(filename+'.new','wb')
- m = hashlib.md5()
- while recesize <file_total_size: #接受的文件大小小于总大小, 就继续接收
- if file_total_size - recesize> 1024: #判断最后一次接收
- size = 1024
- else:# 最后一次发送, 解决粘包问题 (md5)
- size = file_total_size - recesize
- print('最后一次接收的大小是:',size)
- print('传进来的 size 是:',size)
- data = client.recv(size)# 接收客户端的数据
- recesize += len(data)
- print(recesize)
- m.update(data)# 计算 md5
- f.write(data)# 写入数据到 new 文件
- print('目前接收的原大小和接收的文件大小',file_total_size,recesize)
- else:
- new_file_md5 = m.hexdigest()# 获取接收后的文件 md5
- print('下载 recv 结束')
- f.close()
- server_file_md5 = client.recv(1024)# 接收 server 端的 md5
- print(server_file_md5.decode())
- print(new_file_md5)
- client.close()
来源: http://www.bubuko.com/infodetail-3412794.html