TCP 소켓 메시지 프레이밍 이해: bufio.Reader의 역할
Go 서버 코드에서 net.Conn이 어떻게 작동하는지에 대해 혼란을 표현하셨습니다. .Read는 영구 TCP 소켓을 통해 수신된 메시지의 끝을 감지합니다. HTTP와 같은 프로토콜과 달리 TCP 자체는 자연스러운 메시지 프레이밍 메커니즘을 제공하지 않습니다. 메시지 프레이밍을 위한 자체 프로토콜을 구현하는 것은 애플리케이션의 책임입니다.
Enter bufio.Reader: 스트림 처리 강화
효율적이고 유연한 스트림 처리를 촉진하기 위해 Go는 다음을 제공합니다. bufio.Reader 유형. bufio.Reader에서 TCP 연결을 래핑하면 여러 가지 이점이 있습니다.
bufio.Reader를 사용한 메시지 프레이밍의 예:
다음은 bufio.Reader를 사용하여 TCP의 메시지를 구문 분석하는 방법을 보여주는 예입니다. server:
package main import ( "bufio" "fmt" "net" ) func main() { ln, err := net.Listen("tcp", ":8080") if err != nil { // Handle error } for { conn, err := ln.Accept() if err != nil { // Handle error } go handleConnection(conn) } } func handleConnection(conn net.Conn) { defer conn.Close() // Wrap the connection in a bufio.Reader buff := make([]byte, 50) c := bufio.NewReader(conn) for { // Read a single byte representing the message length size, err := c.ReadByte() if err != nil { // Handle error } // Read the message according to its size _, err = io.ReadFull(c, buff[:int(size)]) if err != nil { // Handle error } // Process the received message fmt.Printf("Received message: %x\n", buff[:int(size)]) } }
이 예에서 각 메시지에는 길이를 지정하는 헤더 바이트가 있습니다. bufio.ReadByte()를 사용하여 먼저 길이를 읽은 다음 io.ReadFull을 사용하여 지정된 길이에 따라 메시지의 나머지 부분을 읽습니다. 이를 통해 다양한 크기의 메시지를 효율적으로 구문 분석할 수 있습니다.
위 내용은 bufio.Reader는 Go에서 TCP 소켓 메시지 프레이밍을 어떻게 해결합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!