python 基于tcp发送文件

思路:
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()

 

posted @ 2020-09-16 15:17  NQ31  阅读(351)  评论(1编辑  收藏  举报