python3-基于socket,实现简单文件传输

服务端

import struct, json, socket

IP = '127.0.0.1'
PORT = 8080
ADD = (IP, PORT)
sever = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sever.bind(ADD)
sever.listen(5)

conn, addr = sever.accept()
'''获取报头长度bytes'''
s_hander = conn.recv(4)

'''解包bytes-》tuple-》int,获得报头长度'''
s_hander = struct.unpack('i', s_hander)[0]
print(s_hander)

'''获取报头数据,bytes'''
b_hander = conn.recv(s_hander)
print(b_hander)

'''报头数据解码 bytes-》str'''
json_hander = b_hander.decode('utf-8')
print(json_hander)

'''报头数据反序列化 str-》dict'''
hander = json.loads(json_hander)
print(hander)

'''获取报头字典,取的文件长度,取出文件内容'''
file_size = hander['length']
res = b''
size = 0
while size < file_size:
    date = conn.recv(1024)
    size += len(date)
    res += date
print(res.decode('utf-8'))

# date = (conn.recv(file_size)).decode('utf-8')
# print(date)

客户端

import socket, os, json, struct

IP = '127.0.0.1'
PORT = 8080
ADD = (IP, PORT)
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(ADD)

# 上传文件
while True:
    file_path = input('请输入文件路径>>').strip()
    if not os.path.exists(file_path):
        print('文件不存在')
        continue
    file_name = (os.path.split(file_path))[1]
    with open(file_path, 'r', encoding='utf-8')as f:
        date = f.read()
        size = len(date)

    hander = {
        'file_name': file_name,
        'length': size
    }
    # 报头序列化
    hander_json = json.dumps(hander)
    # 报头bytes转换
    hander_bytes = hander_json.encode('utf-8')
    # 报头长度固定
    s_hander = struct.pack('i', len(hander_bytes))
    # 传输报头长度
    client.send(s_hander)
    # 传输报头数据
    client.send(hander_bytes)
    # 传输文件数据
    client.send(date.encode('utf-8'))

总结:

-报头设置(传输方 )

1)报头字典编写(dict)

2)报头序列化(dict->str)

3)报头长度固定数据转换(int->bytes)

4)传输报头长度(bytes)

5)传输报头(bytes)

6)传输文件(bytes)

-报头解包(接收方)

1)以固定长度,接收报头长度(bytes)并解码(bytes->int)

2)以报头长度获取报头内容,并解码(bytes->str)

3)报头数据反序列化(str->dict)

4)获取数据长度(bytes)

5)根据数据长度获取数据,并解码(bytes->str)

猜你喜欢

转载自blog.csdn.net/qq_33961117/article/details/82351049
今日推荐