正如我在评论中所说,您的代码有效。我创建了一个小示例来测试或看看我是否可以解决您的问题。所以我想你可以关闭这个问题。


package main


import (

    "compress/gzip"

    "io"

    "log"

    "net"

    "os"

)


func main() {

    // Create a listener on a random port.

    listener, err := net.Listen("tcp", "127.0.0.1:")

    if err != nil {

        log.Fatal(err)

    }

    log.Println("Server listening on: " + listener.Addr().String())

    done := make(chan struct{})

go func() {

    defer func() { done <- struct{}{} }()

    for {

        conn, err := listener.Accept()

        if err != nil {

            log.Println(err)

            return

        }

        go func(c net.Conn) {

            defer func() {

                c.Close()

                done <- struct{}{}

            }()

            buf := make([]byte, 1024)

            for {

                n, err := c.Read(buf)

                if err != nil {

                    if err != io.EOF {

                        log.Println(err)

                    }


                    return

                }

                log.Printf("received: %q", buf[:n])

                log.Printf("bytes: %d", n)


            }


        }(conn)

    }

}()


    conn, err := net.Dial("tcp", listener.Addr().String())

    if err != nil {

        log.Fatal(err)

    }

    log.Println("Connected to server.")


    file, err := os.Open("./file.txt")

    if err != nil {

        log.Fatal(err)

    }


    pr, pw := io.Pipe()

    w, err := gzip.NewWriterLevel(pw, 7)

    if err != nil {

        log.Fatal(err)

    }

    go func() {

        n, err := io.Copy(w, file)

        if err != nil {

            log.Fatal(err)

        }

        w.Close()

        pw.Close()

        log.Printf("copied to piped writer via the compressed writer: %d", n)

    }()


    n, err := io.Copy(conn, pr)

    if err != nil {

        log.Fatal(err)

    }

    log.Printf("copied to connection: %d", n)


    conn.Close()

    <-done

    listener.Close()

    <-done

}

该程序的输出带有一个简单的文本文件,其中包含许多重复的字符,以便压缩:文件为 153 字节,我发送/接收了 46 字节


2022/04/04 11:23:58 Server listening on: 127.0.0.1:58250

2022/04/04 11:23:58 Connected to server.

2022/04/04 11:23:58 received: "\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff"

2022/04/04 11:23:58 bytes: 10

2022/04/04 11:23:58 copied to piped writer via the compressed writer: 153

2022/04/04 11:23:58 copied to connection: 46

2022/04/04 11:23:58 received: "*I-.I,NI,N\xc1\x01\x8aS\x8a\x13i\bx\xb9pX    \r\b\x00\x00\xff\xff\xc7\xfe\xa6c\x99\x00\x00\x00"

2022/04/04 11:23:58 bytes: 36

2022/04/04 11:23:58 accept tcp 127.0.0.1:58250: use of closed network connection