猿问

在 Go 中作为客户端从服务器获取 EOF

我有一些用于自定义协议的 Go 客户端。该协议是 lz4 压缩的 JSON-RPC,带有一个四字节的标头,给出了压缩 JSON 的长度。


func ReceiveMessage(conn net.Conn) ([]byte, error) {

    start := time.Now()

    bodyLen := 0

    body := make([]byte, 0, 4096)

    buf := make([]byte, 0, 256)


    for bodyLen == 0 || len(body) < bodyLen {

        if len(body) > 4 {

            header := body[:4]

            body = body[:4]

            bodyLen = int(unpack(header))

        }


        n, err := conn.Read(buf[:])

        if err != nil {

            if err != io.EOF {

                return body, err

            }

        }

        body = append(body, buf[0:n]...)


        now := time.Now()

        if now.Sub(start) > time.Duration(readTimeout) * time.Millisecond     {

            return body, fmt.Errorf("Timed-out while reading from socket.")

        }

        time.Sleep(time.Duration(1) * time.Millisecond)

    }


    return lz4.Decode(nil, body)

}

客户端:


func main() {

    address := os.Args[1]

    msg := []byte(os.Args[2])


    fmt.Printf("Sending %s to %s\n", msg, address)


    conn, err := net.Dial(address)

    if err != nil {

        fmt.Printf("%v\n", err)

        return

    }


    // Another library call

    _, err = SendMessage(conn, []byte(msg))

    if err != nil {

        fmt.Printf("%v\n", err)

        return

    }


    response, err := ReceiveMessage(conn)

    conn.Close()


    if err != nil {

        fmt.Printf("%v\n", err)

        return

    }


    fmt.Printf("Response: %s\n", response)

}

当我调用它时,我没有得到响应,它只是超时。(如果我没有明确忽略 EOF,它会返回 io.EOF 错误。)我有另一个用 Python 编写的库,它也适用于具有相同负载的相同端点。你马上看到什么了吗?


斯蒂芬大帝
浏览 370回答 2
2回答
随时随地看视频慕课网APP

相关分类

Go
我要回答