bufio.Reader는 Go에서 TCP 소켓 메시지 프레이밍을 어떻게 해결합니까?

Susan Sarandon
풀어 주다: 2024-11-25 19:49:11
원래의
728명이 탐색했습니다.

How Does bufio.Reader Solve TCP Socket Message Framing in Go?

TCP 소켓 메시지 프레이밍 이해: bufio.Reader의 역할

Go 서버 코드에서 net.Conn이 어떻게 작동하는지에 대해 혼란을 표현하셨습니다. .Read는 영구 TCP 소켓을 통해 수신된 메시지의 끝을 감지합니다. HTTP와 같은 프로토콜과 달리 TCP 자체는 자연스러운 메시지 프레이밍 메커니즘을 제공하지 않습니다. 메시지 프레이밍을 위한 자체 프로토콜을 구현하는 것은 애플리케이션의 책임입니다.

Enter bufio.Reader: 스트림 처리 강화

효율적이고 유연한 스트림 처리를 촉진하기 위해 Go는 다음을 제공합니다. bufio.Reader 유형. bufio.Reader에서 TCP 연결을 래핑하면 여러 가지 이점이 있습니다.

  • 향상된 I/O 효율성: bufio.Reader는 버퍼링 기술을 사용하여 시스템 호출 및 데이터 복사를 최소화합니다. 더 빠른 I/O 작업.
  • 단순한 프레이밍: 구조화된 방식으로 데이터를 읽는 편리한 방법을 제공하므로 프로토콜에 따라 메시지를 더 쉽게 구문 분석할 수 있습니다.

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

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿