思路:
1、把文件名,文件大小封转成一个字典
2、用struct模块封装成头信息
3、把该头部信息先发给对方
4、打开文件,逐行读取并发送
遇到问题:file_size=os.path.getsize(filename)得到的文件大小,比实际发送的文件大小偏大,具体原因还没查到?
解决方法:先暂时采用read()读取全部文件数据,用len()方法求出文件大小。
客户端源码如下:
# -*-coding:utf-8 -*- import socket import os import json import struct import time c=socket.socket(socket.AF_INET,socket.SOCK_STREAM) c.connect(('localhost',8333)) while True: filename=input(">>:").strip() if not os.path.isfile(filename): print(filename+"文件不存在") break else: # file_size=os.path.getsize(filename) count=0 with open(filename,'r',encoding='utf-8') as f: data=f.read() file_size=len(data.encode()) headic = {"filename": os.path.basename(filename), "size": file_size} print(headic) headerjson = json.dumps(headic) headerbyte = bytes(headerjson, encoding='utf-8') header = struct.pack("i", len(headerbyte)) c.send(header) c.send(headerbyte) with open(filename,'r',encoding='utf-8') as f1: for line in f1: print('开始发送') c.send(line.encode()) count+=len(line.encode()) print('发送完毕',count)
服务端代码如下:
# -*-coding:utf-8 -*- import socketserver import os import json import struct import time class Myhandle(socketserver.BaseRequestHandler): def handle(self): while True: #解析头部信息 header=self.request.recv(4) header1=struct.unpack('i',header)[0] header_dic=self.request.recv(header1) header_dic=header_dic.decode('utf-8') header_json=json.loads(header_dic) filename="server"+header_json['filename'] filesize=header_json['size'] with open(filename,'wb') as f: print('开始接收') while filesize>0: line=self.request.recv(8192) print(len(line)) f.write(line) filesize-=len(line) print('接收完毕') if __name__=="__main__": server=socketserver.ThreadingTCPServer(('localhost',8333),Myhandle) server.serve_forever()