码迷,mamicode.com
首页 > Web开发 > 详细

定制报文——文件的上传下载

时间:2019-05-18 18:27:42      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:send   接收   字符串   save   style   lse   端口   ash   encode   

报文的概念:

  我们在网络上传输的所有数据,都叫数据包,数据包里的所有数据都叫报文。

  报文里含有你的数据,IP地址,MAC地址,端口号等

  所有的报文都有报头,根据报头可以知道接收多少个字节

自定义报文

  例如:传输文件,需要传输的内容如下

  文件名,文件大小,文件类型,存储路径

  head = {‘filename‘:‘test‘,‘filesize‘:10000,‘filetype‘:‘txt‘,‘filepath‘:r‘\usr\bin‘}

  顺序:

    报头的长度————————————先接收4给字节

    send(head) #报头—————————根据这4个字节获取报头

    send(file)    # 报文—————————从报头中获取filesize,然后根据filesize接收文件

上传端

技术图片
# 发送端
import socket
import os
import json
import struct
buffer = 1024
sk = socket.socket()
sk.connect((127.0.0.1,8090))

# 发送文件
head = {filepath:rC:\Users\Mr.Feng\Pictures\Saved Pictures,
        filename:r99eae72194524579f72b253436689019.jpg,
        filesize:None
        }
filepath = os.path.join(head[filepath],head[filename])
filesize = os.path.getsize(filepath)
head[filesize] = filesize
json_head = json.dumps(head)    # 字典转成字符串
bytes_head = json_head.encode(utf-8)
# 计算head长度
head_len = len(bytes_head)
pack_head = struct.pack(i,head_len)
print(head_len,pack_head)
sk.send(pack_head)  # 先发报头长度
sk.send(bytes_head) # 再发送bytes类型报头
with open(filepath,rb) as f:
    while filesize:
        print(filesize)
        if filesize>=buffer:
            content = f.read(buffer)
            sk.send(content)
            filesize -= buffer
        else:
            content = f.read(filesize)
            sk.send(content)
            break
sk.close()
发送端

下载端

技术图片
# 实现一个大文件的上传或者下载
# 配置文件:IP地址,端口号
import json
import socket
import struct
buffer = 1024
sk = socket.socket()
sk.bind((127.0.0.1,8090))
sk.listen(0)

conn,addr = sk.accept()
# 接收
head_len = conn.recv(4)
head_len = struct.unpack(i,head_len)[0]
json_head = conn.recv(head_len).decode(utf-8)
head = json.loads(json_head)
filesize = head[filesize]
with open(head[filename],wb) as f:
    while filesize:
        print(filesize)
        if filesize>=buffer:
            content = conn.recv(buffer)
            f.write(content)
            filesize -= buffer
        else:
            content = conn.recv(filesize)
            f.write(content)
            break
conn.close()
sk.close()
接收端

 

定制报文——文件的上传下载

标签:send   接收   字符串   save   style   lse   端口   ash   encode   

原文地址:https://www.cnblogs.com/Mr-Feng/p/10886595.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!