gpt4 book ai didi

json - 基于 TCP 的 JSON 传输选择

转载 作者:行者123 更新时间:2023-12-03 14:48:28 38 4
gpt4 key购买 nike

我正在编写一个简单的流式 JSON 服务。它由长时间(数周或数月)间断发送的 JSON 消息组成。

通过普通 TCP 套接字发送多个 JSON 消息的最佳实践是什么?

我看过的一些替代方案(及其缺点)是:

  • 换行符分隔 JSON - 缺点:JSON 中的换行符需要转义或禁止
  • websocket 启发了 0x00 0xff 框架 - 缺点:它现在是二进制的,不再是 utf-8
  • 真正的 websockets - 缺点:缺少(开源)websocket 客户端库
  • http 多部分 http://www.w3.org/Protocols/rfc1341/7_2_Multipart.html - 缺点:不完整的客户支持?
  • 没有分隔符 - 缺点:分 block 需要 JSON 解析(由于字符串中的 curl ,不能只计算 curl )

  • 有没有一种好的,或者至少是成熟的方法来做到这一点?

    最佳答案

    消息的四个字节中的第一个可以是一个 32 位整数,指示消息的大小(以字节为单位)。然后接收方应遵循以下步骤:

  • 读取数据的前四个字节并计算出读取整条消息所需的确切字节数。
  • 阅读消息的其余部分并将其反序列化为 JSON

  • C# 中的发送方代码:
            public void WriteMessage(Packet packet) {
    // Convert the object to JSON
    byte[] message = Encoding.UTF8.GetBytes(packet.Serialize());

    // Serialize the number of characters
    byte[] messageLength = BitConverter.GetBytes(message.Length);

    // Build the full message that will hold both the size of the message and the message itself
    byte[] buffer = new byte[sizeof(int) + message.Length];

    Array.Clear(message, 0, message.Length);

    // Print the size into the buffer
    for (int i = 0; i < sizeof(int); i++)
    {
    buffer[i] = messageLength[i];
    }

    // Print the message into the buffer
    for (int i = 0; i < message.Length; i++)
    {
    buffer[i + sizeof(int)] = message[i];
    }

    // Send it
    stream.Write(buffer, 0, buffer.Length);
    }

    关于json - 基于 TCP 的 JSON 传输选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6573870/

    38 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com