如何确定golang中连接的确切字节长度?

时间:2018-08-16 22:08:45

标签: go buffer

我有以下代码:

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_lenbuf,然后创建第二个buffer,它是传入的json请求的确切长度。这只会导致错误

  

JSON输入意外结束

当我尝试解组

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

我假设发生此错误是因为conn.Read(buffer)不返回任何值,因为另一个缓冲区已经读取了它(虽然不确定)。我应该如何确定json请求的长度,同时又能够将其读入缓冲区(长度完全相同)?

1 个答案:

答案 0 :(得分:2)

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值。