代码之家  ›  专栏  ›  技术社区  ›  Andrew

如何确定果朗连接的确切字节长度?

  •  0
  • Andrew  · 技术社区  · 6 年前

    我有以下代码:

    var buf []byte
    read_len, err := conn.Read(buf)
    if err != nil {
        fmt.Println("Error reading:", err.Error())
    }
    buffer := make([]byte, read_len)
    _, err = conn.Read(buffer)
    if err != nil {
        fmt.Println("Error reading:", err.Error())
    }
    

    目的是确定 read_len 有了第一个 buf ,然后创建第二个 buffer 这是传入json请求的确切长度。这只会导致一个错误

    JSON输入意外结束

    var request Device_Type_Request_Struct
    err = json.Unmarshal(buffer, &request)
    

    我假设这个错误是因为 conn.Read(buffer) 没有返回任何内容,因为另一个缓冲区已经读取了它(但不确定)。我应该如何确定json请求的长度,同时还能将其读入缓冲区(长度完全相同)?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Cerise Limón    6 年前

    Read 返回读取到缓冲区的字节数。由于传递给conn.Read的第一个调用的缓冲区长度为零,因此对conn.Read的第一个调用始终返回零。

    如果不读取数据,就无法确定对等方发送了多少数据。

    解决这个问题的简单方法是使用 JSON decoder

    d := json.NewDecoder(conn)
    var request Device_Type_Request_Struct
    if err := d.Decode(&request); err != nil {
        // handle error
    }
    

    解码器从流中读取并解码JSON值。