Python基于TCP的文件上传

TCP的文件上传主要考虑到如下几个问题:

  1. TCP的粘包问题--可以通过struct模块解决

               --利用struck两个主要内置函数pack,unpack可以将发送的字符长度加工为指定的四个字节,这样接受的时候只接收四个字节长度的数据,就可以避免TCP的粘包

  1. 如何获取上传文件的大小及文件名--os模块的引用
  2. recv()每次接收的数据大小多是有限制的,如何传输较大的文件--通过while循环实现

server端

import json
import socket
import struct
# 接收
sk = socket.socket()
sk.bind(('127.0.0.1', 9002))
sk.listen()

conn, adrss = sk.accept()
msg_len = conn.recv(4)       # 接收指定的四个字节的数据,表示的json串的长度,返回的是列表
dic_len = struct.unpack('i', msg_len)[0]     # 列表的第一个元素为接收到数据
msg = conn.recv(dic_len).decode('utf-8')
msg = json.loads(msg)

with open(msg['filename'], 'wb') as f:      # 以字节的形式写入文件
    while msg['filesize'] > 0:
        content = conn.recv(1024)
        msg['filesize'] -= len(content)     # 在当前长度的基础上减去收到的数据长度
        f.write(content)
conn.close()
sk.close()



client端

import json
import socket
import os
import struct
# 发送
sk = socket.socket()
sk.connect(('127.0.0.1', 9002))

# 文件名\文件大小
abs_path = r'上传文件的绝对路径'
filename = os.path.basename(abs_path)    # 获取上传文件的文件名
filesize = os.path.getsize(abs_path)     # 获取上传文件的文件大小
dic = {'filename': filename, 'filesize': filesize}
str_dic = json.dumps(dic)
b_dic = str_dic.encode('utf-8')
mlen = struct.pack('i', len(b_dic))      # 通过struct模块将表示json长度的数值加工成四个字节
sk.send(mlen)           # 发送四个字节表示的长度
sk.send(b_dic)          # 发送字典的内容

with open(abs_path, 'rb') as f:
    while filesize > 0:       # 通过循环每次读取1024并发送
        content = f.read(1024)
        filesize -= len(content)
        sk.send(content)

sk.close()

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

这是小刘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值