QT在JSON内容前面加上JSON的长度使用TCP发送给服务器端
在使用TCP发送JSON数据时,可以在JSON内容前面加上一个固定长度的数字,表示JSON数据的长度,这样服务器端就可以根据长度来正确解析JSON数据。
以下是一个示例代码:
import json
import struct
import socket
def send_json_data(data, sock):
    json_data = json.dumps(data)
    json_len = len(json_data)
    # 将JSON数据长度转换为4字节的二进制数据
    len_bytes = struct.pack('I', json_len)
    # 发送JSON数据长度
    sock.send(len_bytes)
    # 发送JSON数据
    sock.send(json_data.encode())
# 创建socket连接
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('localhost', 8888))
# 发送JSON数据
data = {'name': 'Alice', 'age': 20}
send_json_data(data, sock)
# 关闭socket连接
sock.close()
在服务器端接收JSON数据时,先接收4字节的二进制数据,然后根据这个长度接收JSON数据。以下是一个示例代码:
import json
import struct
import socket
def recv_json_data(sock):
    # 接收JSON数据长度
    len_bytes = sock.recv(4)
    # 将4字节的二进制数据转换为整数
    json_len = struct.unpack('I', len_bytes)[0]
    # 接收JSON数据
    json_data = sock.recv(json_len).decode()
    return json.loads(json_data)
# 创建socket连接
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('localhost', 8888))
sock.listen(1)
# 接收JSON数据
conn, addr = sock.accept()
data = recv_json_data(conn)
print(data)
# 关闭socket连接
conn.close()
sock.close()
在发送JSON数据时,需要注意以下几点:
- JSON数据必须是字符串类型,可以使用
json.dumps()方法将Python对象转换为JSON字符串。 - 计算JSON数据长度时,需要使用
len()函数,计算出来的长度是整数类型。 - 将整数类型的长度转换为4字节的二进制数据时,可以使用
struct.pack()方法。 - 发送数据时,需要使用
send()方法,将二进制数据发送给服务器端。 
在接收JSON数据时,需要注意以下几点:
- 首先接收4字节的二进制数据,将其转换为整数,这个整数表示后面要接收的JSON数据的长度。
 - 使用
recv()方法接收JSON数据,指定接收的长度为JSON数据的长度。 - 将接收到的JSON数据字符串转换为Python对象,可以使用
json.loads()方法。 - 接收数据时,需要使用
recv()方法,每次接收一定长度的二进制数据,直到接收完整个JSON数据。 
以上是使用TCP发送JSON数据时,在数据前面加上长度的方法。这种方法可以确保服务器端正确解析JSON数据,并且可以防止数据粘包和拆包的问题
原文地址: https://www.cveoy.top/t/topic/eF2b 著作权归作者所有。请勿转载和采集!