通过套接字发送JSON有效负载大小和数据

时间:2019-07-17 15:26:33

标签: python sockets byte

我曾经只通过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))

1 个答案:

答案 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)
  • !表示网络字节顺序,为大字节序
  • 我表示一个无符号的整数

然后我标记了字符串。

总体来说,数据看起来像

  • 00 01 38 80 7B 22 6D 73 67 22 3A 20 ...

前4个字节是有效负载大小,其后是JSON字符串。