如果没有EOF,从Golang中的服务器读取Unix套接字响应的最佳方法是什么?

时间:2018-06-21 00:39:07

标签: sockets go unix-socket

我想从服务器读取完整的响应,但是我不知道它的确切大小。

我希望它能起作用:

message, err := ioutil.ReadAll(conn)

但是服务器未发送EOF,因此该语句挂起。

我知道它是一个JSON响应,因此我可以读取数据直到最后一个},但这似乎并不是实现它的最佳方法。

阅读完整回复的最佳实践是什么?


更新:

过了一会儿,我发现这种方式是可能的:

var m map[string]interface{}
d := json.NewDecoder(conn)
d.Decode(&m)

for key, value := range m {
    fmt.Print(key)
    fmt.Print(" : ")
    fmt.Print(value)
    fmt.Print("\n")
    switch vv := value.(type) {
    case map[string]interface{}:
        for k, v := range vv {
            fmt.Print(k)
            fmt.Print(" : ")
            fmt.Print(v)
            fmt.Print("\n")
        }
    }
}

2 个答案:

答案 0 :(得分:1)

您想要一个json.Decoder。解码器用于读取JSON对象流。它从流中读取直到接收到完整的对象,然后将其解组到提供的对象指针上。

示例:

package main

import (
    "encoding/json"
    "fmt"
    "io"
)

func main() {
    pr, pw := io.Pipe()
    go pw.Write([]byte(`{"foo":"bar"}`))
    var data map[string]string
    json.NewDecoder(pr).Decode(&data)
    fmt.Printf("Data: %v\n", data)
}

https://play.golang.org/p/JQMXGzrDAH-

哪个输出:

Data: map[foo:bar]

答案 1 :(得分:1)

使用json.Decoder。阅读多个消息的方法如下:

 d := json.NewDecoder(conn)
 for {
     var m message // <-- use whatever type is appropriate for your app
     err := d.Decode(&m)
     if err == io.EOF {
         break
     } else if err != nil {
         // handle error
     }
     // do something with m
}

如果只希望收到一条消息,请删除循环。