Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah saya membaca data dengan tepat daripada Go net.Conn?

Bagaimanakah saya membaca data dengan tepat daripada Go net.Conn?

Patricia Arquette
Lepaskan: 2024-11-09 13:18:02
asal
544 orang telah melayarinya

How do I read data accurately from a Go net.Conn?

Membaca Data dengan Ketepatan dalam jaring Go.Conn

Dalam bidang aplikasi rangkaian Go, masalah membaca data dengan tepat daripada jaring.Conn boleh timbul. Fungsi Conn.Read terbina dalam, walaupun mudah, membaca data ke dalam tatasusunan bait yang ditentukan pengguna dengan saiz terhad. Ini boleh menyebabkan peruntukan penimbal yang tidak mencukupi atau berlebihan, bergantung pada saiz data sebenar.

Untuk menangani dilema ini, seseorang boleh memanfaatkan pakej bufio yang berkuasa. Dengan mengembangkan penimbal dalaman secara dinamik mengikut keperluan, bufio menyelaraskan proses membaca kandungan yang tidak diketahui panjangnya. Berikut ialah contoh yang diubah suai:

package main

import (
    "bufio"
    "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()
    fmt.Fprintf(conn, "GET / HTTP/1.0\r\n\r\n")

    // Create a bufio.Scanner to read the response.
    scanner := bufio.NewScanner(conn)

    // Iterate over the lines of the response.
    for scanner.Scan() {
        line := scanner.Text()
        fmt.Println(line)
    }

    // Check for any errors that occurred during scanning.
    if err := scanner.Err(); err != nil {
        fmt.Println("scanner error:", err)
    }
}
Salin selepas log masuk

Kod ini memulakan objek bufio.Scanner dengan net.Conn sebagai sumbernya. Pengimbas membaca data secara berterusan sehingga ia menghadapi keadaan akhir fail (EOF) atau ralat. Pendekatan ini secara automatik mengendalikan pengembangan penimbal apabila data distrim masuk, memastikan bacaan yang tepat dan cekap.

Sebagai alternatif, untuk pendekatan yang lebih langsung, anda boleh menggunakan io.Copy, seperti yang dicadangkan oleh @fabrizioM:

func main() {
    conn, err := net.Dial("tcp", "google.com:80")
    if err != nil {
        fmt.Println("dial error:", err)
        return
    }
    defer conn.Close()
    fmt.Fprintf(conn, "GET / HTTP/1.0\r\n\r\n")

    // Create a bytes.Buffer to store the response.
    var buf bytes.Buffer
    io.Copy(&buf, conn)

    // Print the total size of the response.
    fmt.Println("total size:", buf.Len())
}
Salin selepas log masuk

Contoh ini menggunakan io.Copy untuk memindahkan kandungan net.Conn ke dalam byte.Buffer, yang mengurus peruntukan dan pengembangan penimbal secara dalaman.

Atas ialah kandungan terperinci Bagaimanakah saya membaca data dengan tepat daripada Go net.Conn?. 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