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 중국어 웹사이트의 기타 관련 기사를 참조하세요!