一、文件传送步骤
我们要利用socket来实现下载一个文件,该如何操作呢?
服务端:
- 读取文件名
- 判断文件是否存在
- 检测文件大小(用于和客户端对比判断文件是否传送完毕)
- 发送文件大小给客户端
- 等待客户端确认(防止粘包)
- 打开文件
- 边读边发送数据
- md5验证
客户端:
- 发送命令
- 接收文件大小
- 返回确认
- 获取文件名
- 对比文件大小
- 写入文件
二、功能实现(ftp下载功能)
服务端:
# -*- coding: UTF-8 -*- import os import socket # TCP/IP协议, tcp ,如果不填写就是默认这个 server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind(('localhost', 9999)) server.listen() while True: # 可以接受多个客户端 conn, addr = server.accept() print('new conn', addr) while True: cmd_res = conn.recv(1024) if not cmd_res: # 防止当接受的客户端数据为空时,程序卡掉 print('client has lost...') break else: # 获取命令和文件名 cmd, filename = cmd_res.decode().split() print(cmd, filename) if os.path.isfile(filename): # 判断文件是否存在 # 文件大小 file_size = os.stat(filename).st_size # 发送文件大小 conn.send(str(file_size).encode(encoding='utf-8')) # 等待客户端确认 conn.recv(1024) # 打开文件 f = open(filename, 'rb') for line in f: conn.send(line) print('sending') f.close()