我曾经只通过Python套接字发送过字符串,现在我想尝试通过JSON发送数据,这也通知了另一边数据的大小(有效负载)。对于有效负载头,我希望它是4个字节,即使大小不在第一个字节之前,也应该是00。
示例:十进制1010->十六进制0x03f2,因此有效载荷报头为00 00 03 f2
对于端倪
发布之前,我意识到这可能是个问题。我在想网络字节顺序,是 Big Endian 。
到目前为止我有
from __future__ import print_function
import json
import os
import struct
import sys
import time
from io import BytesIO
from threading import Thread
import socket
server_ip = 'localhost'
server_port = 1337
def server_thread():
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((server_ip, server_port))
server_socket.listen(1)
client_sock, address = server_socket.accept()
print('Accepted connection from {}:{}'.format(address[0], address[1]))
while client_sock:
request = client_sock.recv(8192)
if not request:
break
fd = open('payload.data', 'w')
fd.write(request)
fd.flush()
fd.close()
print('Closing server')
server = Thread(target=server_thread)
server.start()
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((server_ip, server_port))
# Convert
data = json.load(open('data.json', 'r'))
try:
data_size = (len(json.dumps(data).encode('utf-8')))
except Exception as e:
print(e)
client_socket.send(json.dumps(data))
client_socket.close()
我过去使用过struct,但是否可以将有效载荷头,json数据全部打包为一个?
谢谢! data.json是任意的,可随意设置。我用过
{
"data" : "I love data."
}
更新
由于这可能是一个奇怪的问题或困难,idk?我将发布进度。
这会将数据转换为Big Endian,并且具有两个字节,现在我只需要第三个字节。字符串也只是一个地方,尽管我认为这是文档中的数组。
fmt = '>Hs'
struct_data = struct.pack(fmt, data_size, json.dumps(data))
答案 0 :(得分:1)
在研究了Python的Struct模块之后,我终于找到了答案。
本来我想有一个3字节的有效载荷头,但是后来我改成了4字节以适应我的答案。
try:
data_size = (len(json.dumps(data).encode('utf-8')))
struct_data = struct.pack('!I', data_size) + json.dumps(data)
except Exception as e:
print(e)
然后我标记了字符串。
总体来说,数据看起来像
前4个字节是有效负载大小,其后是JSON字符串。