理解TCP 套接字訊息幀:bufio.Reader 的角色
在你的Go 伺服器程式碼中,你對net.Conn的作用表示困惑.Read 偵測透過持久TCP 套接字接收到的訊息的結尾。與 HTTP 等協定不同,TCP 本身不提供任何自然的訊息成幀機制。應用程式有責任實現自己的幀消息協定。
輸入 bufio.Reader:增強流處理
為了促進高效靈活的流處理,Go 提供了bufio.Reader 類型。將TCP 連接包裝在bufio.Reader 中具有以下幾個優點:
使用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 Socket 訊息分幀?的詳細內容。更多資訊請關注PHP中文網其他相關文章!