使用Go 的net.Conn.Read 讀取未知長度的資料
在Go 中使用網路應用程式時,Conn.Read函數提供從連接的端點檢索資料的方法。然而,它使用有限的位元組數組進行操作,當內容的長度未知時,這可能並不總是足夠。
問題:如何解決這個挑戰以精確讀取整個可用資料?
答案: 方法的選擇取決於應用程式的特定要求和資料的性質。以下是一些可能的解決方案:
使用bufio
bufio 套件提供了多種促進資料緩衝的方法,可用於讀取直到檔案末尾(EOF) 。例如,以下程式碼示範了從套接字連接讀取所有資料:
func main() { conn, err := net.Dial("tcp", "google.com:80") if err != nil { fmt.Println("dial error:", err) return } defer conn.Close() fmt.Fprintf(conn, "GET / HTTP/1.0\r\n\r\n") reader := bufio.NewReader(conn) buf, err := ioutil.ReadAll(reader) if err != nil { if err != io.EOF { fmt.Println("read error:", err) } return } fmt.Println("total size:", len(buf)) }
使用bytes.Buffer
對於需要的應用程序,請考慮使用bytes.Buffer任意大小的緩衝區。以下修改後的範例示範了這種方法:
func main() { conn, err := net.Dial("tcp", "google.com:80") if err != nil { fmt.Println("dial error:", err) return } defer conn.Close() fmt.Fprintf(conn, "GET / HTTP/1.0\r\n\r\n") var buf bytes.Buffer io.Copy(&buf, conn) fmt.Println("total size:", buf.Len()) }
注意: 這些解決方案假設連線保持活動狀態並且繼續接收數據,直到應用程式讀取全部資料或到達EOF。如果連線提前終止,接收到的資料大小可能會不完整。
以上是如何使用Go的net.Conn.Read讀取未知長度的資料?的詳細內容。更多資訊請關注PHP中文網其他相關文章!