python socket分包发送数据

server端:

import queue
import socket
import json
import struct
import time
buffer=1024
import os
q2=queue.Queue()
file_path=os.path.join(os.getcwd(),'test.json')
with open(file_path,'r') as f:
    data_json=json.load(f)
    q2.put(data_json)
    f.close()
q2.put('{"a":2,"b":2,"d":1212121}')
q2.put('{"a":3,"b":2}')
q2.put('{"a":5,"b":2}')
q2.put('{"a":5,"b":2}')
sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sk.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1)
sk.bind(('127.0.0.1', 44455))
sk.listen(1)
conn, addr = sk.accept()
while True:
    if not q2.empty():
        data_str = q2.get()
        print('发送data_str')
        json_data = json.dumps(data_str)  # 字典转成了字符串
        byte_data = json_data.encode('utf-8')  # 字符串转成了bytes
        data_len = len(byte_data)  # 报头的长度
        pack_len = struct.pack('i', data_len)
        print(pack_len)
        conn.send(pack_len)  # 先发报头的长度
        # conn.send(byte_data)
        i = 0
        while data_len > 0:
            print(data_len)
            if data_len >= buffer:
                content = byte_data[i * buffer:(i + 1) * buffer]
                conn.send(content)
                data_len -= buffer
                i += 1
            else:
                content = byte_data[i * buffer:]
                conn.send(content)
                data_len = 0
                break
# conn.close()
# sk.close()



client端:

import socket
import struct
sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sk.connect(('127.0.0.1',44455))
# 接收文件
buffer=1024
while True:
    pack_len=sk.recv(4) # 报头长度
    print(pack_len)
    if pack_len:
        data_len=struct.unpack('i',pack_len)[0]
        print(data_len)
        # data = sk.recv(data_len).decode('utf-8')
        # print(data)
        content = b''
        while data_len>0:
            print(data_len)
            if data_len >= buffer:
                content_temp = sk.recv(buffer)
                content += content_temp
                data_len -= buffer
            else:
                content_temp = sk.recv(data_len)
                content += content_temp
                data_len = 0
                break
        print(content.decode('utf-8'))



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

chde2Wang

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

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

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

打赏作者

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

抵扣说明:

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

余额充值