簡介:
簡介:管理持久TCP 連線Go 中涉及有效處理傳入資料。本文解決了有關 net.Conn.Read 的常見誤解,並提供了從基於流的 TCP 連線解析資料的實用解決方案。
了解 TCP 資料幀:TCP 是一種基於流的協議,不提供任何訊息幀。這意味著確定傳入資料流中各個訊息的邊界是應用程式的責任。
常見誤解:一個常見的誤解是 net.Conn .Read 自動知道訊息的結尾並相應地繼續。然而,事實並非如此。
自訂訊息幀:要有效解析 TCP 流中的數據,必須定義自訂訊息幀協定。這可以透過在每個訊息中添加一個標頭來指示其長度來實現。
bufio.Reader提高效率:為了提高閱讀效率並提供額外的方法解析時,建議將連接包裝在bufio.Reader.
解決方案:import ( "bufio" "fmt" "io" "net" ) func main() { ln, err := net.Listen("tcp", ":8080") if err != nil { fmt.Println(err) return } for { conn, err := ln.Accept() if err != nil { fmt.Println(err) return } // Wrap the connection in a bufio.Reader br := bufio.NewReader(conn) for { // Read a single byte containing the message length size, err := br.ReadByte() if err != nil { fmt.Println(err) return } // Read the full message buff := make([]byte, size) _, err = io.ReadFull(br, buff) if err != nil { fmt.Println(err) return } fmt.Printf("Received: %x\n", buff) } } }
以下程式碼片段提供如何使用自訂框架解析訊息的範例:
結論:透過定義自訂訊息幀協定使用 bufio.Reader,可以在 Go 中有效地處理持久 TCP 套接字。這種方法允許透過 TCP 流進行高效的資料解析和強大的通訊。以上是Go中如何高效處理TCP持久連接和資料分幀?的詳細內容。更多資訊請關注PHP中文網其他相關文章!