• 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()
    不将就
  • 相关阅读:
    [转]HD钱包的助记词与密钥生成原理
    [转]简单科普私钥、地址、助记词、Keystore的区别
    [转]Sequelize 中文API文档-4. 查询与原始查询
    [转]Node.JS使用Sequelize操作MySQL
    [转]OmniLayer / omnicore API 中文版
    [转]usdt omnicore testnet 测试网络
    [转]USDT与omniCore钱包
    [转]BTC RPC API GetTransaction
    [转]比特币测试链——Testnet介绍
    [转]BTC手续费计算,如何设置手续费
  • 原文地址:https://www.cnblogs.com/nq31/p/13679282.html
Copyright © 2020-2023  润新知