为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
斯蒂芬大帝 2021-10-04 09:35:05
我有一些用于自定义协议的 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 编写的库,它也适用于具有相同负载的相同端点。你马上看到什么了吗?
查看完整描述

2 回答

  • 2 回答
  • 0 关注
  • 363 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信