>백엔드 개발 >Golang >Go net.Conn에서 데이터를 정확하게 읽으려면 어떻게 해야 합니까?

Go net.Conn에서 데이터를 정확하게 읽으려면 어떻게 해야 합니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-09 13:18:02585검색

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

Go의 net.Conn에서 정확하게 데이터 읽기

Go 네트워크 애플리케이션 영역에서 문제 net.Conn에서 데이터를 정확하게 읽을 수 있습니다. 내장된 Conn.Read 기능은 편리하면서도 제한된 크기의 사용자 정의 바이트 배열로 데이터를 읽습니다. 이로 인해 실제 데이터 크기에 따라 버퍼 할당이 부족하거나 과도해질 수 있습니다.

이 딜레마를 해결하려면 강력한 bufio 패키지를 활용할 수 있습니다. bufio는 필요에 따라 내부 버퍼를 동적으로 확장함으로써 길이를 알 수 없는 콘텐츠를 읽는 프로세스를 간소화합니다. 수정된 예는 다음과 같습니다.

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

이 코드는 net.Conn을 소스로 사용하여 bufio.Scanner 개체를 초기화합니다. 검사기는 EOF(파일 끝) 조건이나 오류가 발생할 때까지 계속해서 데이터를 읽습니다. 이 접근 방식은 데이터가 스트리밍될 때 자동으로 버퍼 확장을 처리하여 정확하고 효율적인 읽기를 보장합니다.

또는 보다 직접적인 접근 방식을 위해 @fabrizioM이 제안한 대로 io.Copy를 활용할 수 있습니다.

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

이 예에서는 io.Copy를 사용하여 net.Conn의 콘텐츠를 내부적으로 버퍼 할당 및 확장을 관리하는 bytes.Buffer로 전송합니다.

위 내용은 Go net.Conn에서 데이터를 정확하게 읽으려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.