python基于TCP的粘包问题解决方案

一:struct模块介绍

       暂略

二:粘包问题解决方案

# 套接字服务端

import socket
import struct
import json
import os

server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(('127.0.0.1',8080))
server.listen(5)

conn,client_addr=server.accept()

# 1、制作报头
header_dic={
    'total_size':os.path.getsize('a.txt'),
    'md5':'123svsaef123sdfasdf',
    'filename':'a.txt'
}
header_json = json.dumps(header_dic)
header_bytes = header_json.encode('utf-8')

# 2、先发送报头的长度
header_size=len(header_bytes)
conn.send(struct.pack('i',header_size)) # 把一个整型数字打包成固定字节数(i模式为4字节)的字节对象

# 3、发送报头
conn.send(header_bytes)

# 4、发送真实的数据
with open('a.txt','rb') as f:
    for line in f:
        conn.send(line)

conn.close()
server.close()


# 套接字客户端

import socket
import struct
import json

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

# 1、先收报头的长度
header_size=struct.unpack('i',client.recv(4))[0]   # 固定收4字节,然后解包,得到报头的长度

# 2、接收报头
header_bytes=client.recv(header_size)

# 3、解析报头
header_json=header_bytes.decode('utf-8')
header_dic=json.loads(header_json)

total_size=header_dic[ 'total_size']

# 4、根据报头内的信息,收取真实的数据

with open('a.txt','wb') as f:
    recv_size = 0
    while recv_size < total_size:
        recv_data=client.recv(1024)
        f.write(recv_data)
        recv_size+=len(recv_data)

client.close()


猜你喜欢

转载自blog.csdn.net/hua1011161696/article/details/80368738