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

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

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

Go
鸿蒙传说 2022-11-28 10:16:12
我写了简单的示例代码,它起作用了,但是接收到的文件的大小没有被压缩我的客户端(用于连接到服务器并发送文件):    // 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)请帮助,如何正确使用带副本的管道
查看完整描述

1 回答

?
呼如林

TA贡献1798条经验 获得超3个赞

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


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


查看完整回答
反对 回复 2022-11-28
  • 1 回答
  • 0 关注
  • 253 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号