亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

通過 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 關注
  • 246 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號