通过 TCP (Golang) 压缩和传输文件

我写了简单的示例代码,它起作用了,但是接收到的文件的大小没有被压缩


我的客户端(用于连接到服务器并发送文件):


    // connect to server

    conn, err := net.Dial("tcp", serverAddr)

    CheckError(err)

    defer conn.Close()


    in, err := os.Open(srcFile)

    if err != nil {

        log.Fatal(err)

    }

    pr, pw := io.Pipe()

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

    CheckError(err)

    go func() {

        n, err := io.Copy(gw, in)

        gw.Close()

        pw.Close()

        log.Printf("copied    %v %v", n, err)

    }()

        //maybe error some next?

    _, err = io.Copy(conn, pr)

请帮助,如何正确使用带副本的管道


鸿蒙传说
浏览 254回答 1
1回答

呼如林

正如我在评论中所说,您的代码有效。我创建了一个小示例来测试或看看我是否可以解决您的问题。所以我想你可以关闭这个问题。package mainimport (&nbsp; &nbsp; "compress/gzip"&nbsp; &nbsp; "io"&nbsp; &nbsp; "log"&nbsp; &nbsp; "net"&nbsp; &nbsp; "os")func main() {&nbsp; &nbsp; // Create a listener on a random port.&nbsp; &nbsp; listener, err := net.Listen("tcp", "127.0.0.1:")&nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; log.Fatal(err)&nbsp; &nbsp; }&nbsp; &nbsp; log.Println("Server listening on: " + listener.Addr().String())&nbsp; &nbsp; done := make(chan struct{})go func() {&nbsp; &nbsp; defer func() { done <- struct{}{} }()&nbsp; &nbsp; for {&nbsp; &nbsp; &nbsp; &nbsp; conn, err := listener.Accept()&nbsp; &nbsp; &nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; log.Println(err)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; go func(c net.Conn) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; defer func() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; c.Close()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; done <- struct{}{}&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; buf := make([]byte, 1024)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; n, err := c.Read(buf)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if err != io.EOF {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; log.Println(err)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; log.Printf("received: %q", buf[:n])&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; log.Printf("bytes: %d", n)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }(conn)&nbsp; &nbsp; }}()&nbsp; &nbsp; conn, err := net.Dial("tcp", listener.Addr().String())&nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; log.Fatal(err)&nbsp; &nbsp; }&nbsp; &nbsp; log.Println("Connected to server.")&nbsp; &nbsp; file, err := os.Open("./file.txt")&nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; log.Fatal(err)&nbsp; &nbsp; }&nbsp; &nbsp; pr, pw := io.Pipe()&nbsp; &nbsp; w, err := gzip.NewWriterLevel(pw, 7)&nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; log.Fatal(err)&nbsp; &nbsp; }&nbsp; &nbsp; go func() {&nbsp; &nbsp; &nbsp; &nbsp; n, err := io.Copy(w, file)&nbsp; &nbsp; &nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; log.Fatal(err)&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; w.Close()&nbsp; &nbsp; &nbsp; &nbsp; pw.Close()&nbsp; &nbsp; &nbsp; &nbsp; log.Printf("copied to piped writer via the compressed writer: %d", n)&nbsp; &nbsp; }()&nbsp; &nbsp; n, err := io.Copy(conn, pr)&nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; log.Fatal(err)&nbsp; &nbsp; }&nbsp; &nbsp; log.Printf("copied to connection: %d", n)&nbsp; &nbsp; conn.Close()&nbsp; &nbsp; <-done&nbsp; &nbsp; listener.Close()&nbsp; &nbsp; <-done}该程序的输出带有一个简单的文本文件,其中包含许多重复的字符,以便压缩:文件为 153 字节,我发送/接收了 46 字节2022/04/04 11:23:58 Server listening on: 127.0.0.1:582502022/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: 102022/04/04 11:23:58 copied to piped writer via the compressed writer: 1532022/04/04 11:23:58 copied to connection: 462022/04/04 11:23:58 received: "*I-.I,NI,N\xc1\x01\x8aS\x8a\x13i\bx\xb9pX&nbsp; &nbsp; \r\b\x00\x00\xff\xff\xc7\xfe\xa6c\x99\x00\x00\x00"2022/04/04 11:23:58 bytes: 362022/04/04 11:23:58 accept tcp 127.0.0.1:58250: use of closed network connection
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go