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 中国語 Web サイトの他の関連記事を参照してください。