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
Patricia Arquetteasal
2024-11-09 13:18:02545semak imbas

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)
    }
}

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())
}

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!

Kenyataan:
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