首頁  >  文章  >  後端開發  >  Go的非阻塞TCP讀取中如何處理資料接收不完整的情況?

Go的非阻塞TCP讀取中如何處理資料接收不完整的情況?

DDD
DDD原創
2024-11-04 16:05:02541瀏覽

How to Handle Incomplete Data Reception in Go's Non-Blocking TCP Reads?

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>

其他注意事項

  • 處理一次寫入多個封包的可能性。
  • 使用分隔符號或其他方法定義訊息邊界。
  • 考慮使用 net/textproto 來處理文字基於協定。
  • 實施逾時或截止日期以防止資源匱乏。
  • 檢查網路操作中的所有錯誤以避免屏蔽問題。

以上是Go的非阻塞TCP讀取中如何處理資料接收不完整的情況?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn