在Go 中,您可以使用net.Conn.Read 存取原始網路連接,它會讀取傳入的資料包到一個位元組數組。但是,當您不知道傳入資料的確切大小時,讀入固定大小的陣列可能會導致資料截斷或不必要的緩衝。
要處理此問題,您可以採用更靈活的方法,使用bufio 套件或替代技術。
bufio 套件提供 Reader 類型,讓您可以讀取資料大塊。您可以從 net.Conn 連接建立 Reader 對象,然後使用 ReadSlice 或 ReadBytes 方法讀取數據,直到您遇到特定分隔符號或到達輸入末尾。例如,要讀取資料直到資料包末尾,您可以使用以下程式碼:
package main import ( "bufio" "fmt" "net" ) func main() { conn, err := net.Dial("tcp", "google.com:80") if err != nil { fmt.Println("dial error:", err) return } defer conn.Close() // Create a bufio.Reader from the net.Conn reader := bufio.NewReader(conn) // Read data in chunks until the end of the packet buf := []byte{} for { chunk, err := reader.ReadSlice('\n') if err != nil { if err != io.EOF { fmt.Println("read error:", err) } break } buf = append(buf, chunk...) } fmt.Println("total size:", len(buf)) // fmt.Println(string(buf)) }
或者,您可以使用 bytes.Buffer類型來附加傳入的資料資料區塊並累積總大小:
package main import ( "bytes" "fmt" "io" "net" ) func main() { conn, err := net.Dial("tcp", "google.com:80") if err != nil { fmt.Println("dial error:", err) return } defer conn.Close() // Create a bytes.Buffer to accumulate incoming data var buf bytes.Buffer // Copy data from the net.Conn to the Buffer if _, err = io.Copy(&buf, conn); err != nil { fmt.Println("copy error:", err) } fmt.Println("total size:", buf.Len()) }
透過使用這些方法之一,您可以在沒有資料的情況下處理不同的資料長度截斷或過度緩衝,確保Go中透過網路連線進行高效率資料傳輸。
以上是如何從 Go 中的'net.Conn”讀取區塊資料?的詳細內容。更多資訊請關注PHP中文網其他相關文章!