TCP ソケット メッセージ フレーミングの理解: bufio.Reader の役割
Go サーバー コードで、net.Conn の仕組みについて混乱を表明しました。 .Read は、永続的な TCP ソケット経由で受信したメッセージの終わりを検出します。 HTTP などのプロトコルとは異なり、TCP 自体は自然なメッセージ フレーム メカニズムを提供しません。メッセージをフレーム化するための独自のプロトコルを実装するのはアプリケーションの責任です。
bufio.Reader を入力: ストリーム処理の強化
効率的かつ柔軟なストリーム処理を促進するために、Go はbufio.Reader タイプ。 TCP 接続を bufio.Reader でラップすると、次のような利点があります。
bufio.Reader を使用したメッセージ フレーミングの例:
これは、bufio.Reader を使用してメッセージを解析する方法を示す例です。 TCP サーバー:
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 中国語 Web サイトの他の関連記事を参照してください。