>백엔드 개발 >Golang >Go의 네트워크 연결에서 가변 길이 데이터를 읽는 방법은 무엇입니까?

Go의 네트워크 연결에서 가변 길이 데이터를 읽는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-09 11:05:02980검색

How to Read Variable-Length Data from a Network Connection in Go?

net.Conn.Read를 사용하여 Go에서 가변 길이 데이터 읽기

Go에서 네트워크 애플리케이션으로 작업할 때 다음과 같은 상황에 자주 직면하게 됩니다. 연결을 통해 수신된 데이터의 길이는 가변적입니다. 표준 라이브러리의 net.Conn은 수신된 데이터로 바이트 배열을 채우는 Read라는 메서드를 제공합니다. 그러나 이 접근 방식은 콘텐츠의 정확한 길이를 미리 알지 못하면 문제가 될 수 있으며 데이터를 너무 많이 읽거나 불충분하게 읽을 수 있습니다.

이 문제를 해결하기 위한 한 가지 접근 방식은 bufio를 활용하는 것입니다. 패키지. 그러나 더 효율적인 솔루션은 증가하는 버퍼를 사용하고 EOF(파일 끝)에 도달할 때까지 데이터를 읽는 것입니다.

package main

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

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

    // Write a request to the connection.
    fmt.Fprintf(conn, "GET / HTTP/1.0\r\n\r\n")

    // Create a buffer to store the received data.
    buf := make([]byte, 0, 4096)

    // Read from the connection in a loop until EOF.
    for {
        // Read into a temporary buffer to avoid overwriting existing data in `buf`.
        tmp := make([]byte, 256)
        n, err := conn.Read(tmp)
        if err != nil {
            if err != io.EOF {
                fmt.Println("read error:", err)
            }
            break
        }

        // Append the new data to the buffer.
        buf = append(buf, tmp[:n]...)
    }

    fmt.Println("total size:", len(buf))
}

이 솔루션은 상당한 초기 버퍼를 할당하고 점차적으로 확장합니다. 데이터가 수신되었습니다. EOF에 도달할 때까지 계속해서 읽어 버퍼에 완전한 응답이 포함되도록 합니다. 또한 수신된 데이터의 전체 크기를 추적합니다.

또는 io.Copy와 함께 bytes.Buffer 유형을 활용하여 비슷한 결과를 얻을 수 있습니다.

package main

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

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

    // Write a request to the connection.
    fmt.Fprintf(conn, "GET / HTTP/1.0\r\n\r\n")

    // Create a buffer to store the received data.
    var buf bytes.Buffer

    // Copy the data from the connection into the buffer.
    io.Copy(&buf, conn)

    fmt.Println("total size:", buf.Len())
}

이 접근 방식은 필요에 따라 자동으로 확장되는 버퍼를 사용하여 더욱 깔끔하고 간결한 솔루션을 제공합니다.

위 내용은 Go의 네트워크 연결에서 가변 길이 데이터를 읽는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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