如何使用Go的net.Conn.Read讀取未知長度的資料?
Nov 10, 2024 am 12:15 AM使用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中文網其他相關文章!
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱門文章
倉庫:如何復興隊友
3 週前
By 尊渡假赌尊渡假赌尊渡假赌
擊敗分裂小說需要多長時間?
3 週前
By DDD
Hello Kitty Island冒險:如何獲得巨型種子
3 週前
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前
By 尊渡假赌尊渡假赌尊渡假赌
公眾號網頁更新緩存難題:如何避免版本更新後舊緩存影響用戶體驗?
3 週前
By 王林

熱門文章
倉庫:如何復興隊友
3 週前
By 尊渡假赌尊渡假赌尊渡假赌
擊敗分裂小說需要多長時間?
3 週前
By DDD
Hello Kitty Island冒險:如何獲得巨型種子
3 週前
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前
By 尊渡假赌尊渡假赌尊渡假赌
公眾號網頁更新緩存難題:如何避免版本更新後舊緩存影響用戶體驗?
3 週前
By 王林

熱門文章標籤

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)