Bagaimana untuk Membaca Data dalam Potongan daripada `net.Conn` dalam Go?

Mary-Kate Olsen
Lepaskan: 2024-11-09 12:36:02
asal
664 orang telah melayarinya

How to Read Data in Chunks from a `net.Conn` in Go?

Membaca Data dalam Potongan dengan jaringan Go.Conn.Read

Dalam Go, anda boleh mengakses sambungan rangkaian mentah menggunakan net.Conn.Read, yang membaca paket data masuk ke dalam tatasusunan bait. Walau bagaimanapun, apabila anda tidak mengetahui saiz tepat data yang masuk, membaca ke dalam tatasusunan bersaiz tetap boleh membawa kepada pemangkasan data atau penimbalan yang tidak diperlukan.

Untuk mengendalikan perkara ini, anda boleh menggunakan pendekatan yang lebih fleksibel menggunakan pakej bufio atau teknik alternatif.

Menggunakan bufio

Pakej bufio menyediakan jenis Pembaca, yang membolehkan anda untuk membaca data dalam ketulan. Anda boleh mencipta objek Reader daripada sambungan net.Conn anda, dan kemudian gunakan kaedah ReadSlice atau ReadBytes untuk membaca data sehingga pembatas tertentu ditemui atau penghujung input dicapai. Sebagai contoh, untuk membaca data sehingga penghujung paket, anda boleh menggunakan kod berikut:

package main

import (
    "bufio"
    "fmt"
    "net"
)

func main() {
    conn, err := net.Dial("tcp", "google.com:80")
    if err != nil {
        fmt.Println("dial error:", err)
        return
    }
    defer conn.Close()

    // Create a bufio.Reader from the net.Conn
    reader := bufio.NewReader(conn)

    // Read data in chunks until the end of the packet
    buf := []byte{}
    for {
        chunk, err := reader.ReadSlice('\n')
        if err != nil {
            if err != io.EOF {
                fmt.Println("read error:", err)
            }
            break
        }
        buf = append(buf, chunk...)
    }
    fmt.Println("total size:", len(buf))
    // fmt.Println(string(buf))
}
Salin selepas log masuk

Pendekatan Alternatif

Sebagai alternatif, anda boleh menggunakan bait.Jenis penimbal untuk menambahkan masukan ketulan data dan kumpulkan jumlah saiz:

package main

import (
    "bytes"
    "fmt"
    "io"
    "net"
)

func main() {
    conn, err := net.Dial("tcp", "google.com:80")
    if err != nil {
        fmt.Println("dial error:", err)
        return
    }
    defer conn.Close()

    // Create a bytes.Buffer to accumulate incoming data
    var buf bytes.Buffer

    // Copy data from the net.Conn to the Buffer
    if _, err = io.Copy(&buf, conn); err != nil {
        fmt.Println("copy error:", err)
    }

    fmt.Println("total size:", buf.Len())
}
Salin selepas log masuk

Dengan menggunakan salah satu pendekatan ini, anda boleh mengendalikan panjang data yang berbeza-beza tanpa pemotongan data atau penimbalan yang berlebihan, memastikan pemindahan data yang cekap melalui sambungan rangkaian dalam Go.

Atas ialah kandungan terperinci Bagaimana untuk Membaca Data dalam Potongan daripada `net.Conn` dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan