Go TCP 讀取是非阻塞的:解決不完整的資料接收
在Go 中,TCP 讀取是非阻塞的,這意味著它們會立即返回任何可用的數據,即使它低於預期。此行為與 C 的阻塞讀取不同,C 的阻塞讀取會等待收到所需的資料量。
非阻塞讀取的原因
TCP 作為位元組流運行,在傳輸過程中可能會出現碎片。因此,僅根據接收到的位元組數無法確定訊息的結束。這就需要自訂分隔符號或其他機制來確定訊息邊界。
資料不完整的解決方案
要讀取特定數量的位元組,請使用 io.ReadAtLeast 或 io.ReadFull 。對於任意條件,循環讀取調用,直到沒有錯誤或滿足指定條件。
範例:
<code class="go">package main import ( "fmt" "net" "time" ) func main() { conn, _ := net.Dial("tcp", "127.0.0.1:4243") // Set a deadline to prevent hanging reads _ = conn.SetReadDeadline(time.Now().Add(10 * time.Second)) // Loop to read until a newline is encountered for { buf := make([]byte, 512) n, err := conn.Read(buf) if err != nil { fmt.Println(err) break } if n > 0 { str := string(buf[:n]) if str[len(str)-1] == '\n' { fmt.Println(str) break } } } }</code>
其他注意事項
以上是Go的非阻塞TCP讀取中如何處理資料接收不完整的情況?的詳細內容。更多資訊請關注PHP中文網其他相關文章!