Go で「net.Conn」からデータをチャンクで読み取る方法は?

Mary-Kate Olsen
リリース: 2024-11-09 12:36:02
オリジナル
646 人が閲覧しました

How to Read Data in Chunks from a `net.Conn` in Go?

Go の net.Conn.Read を使用したチャンクでのデータの読み取り

Go では、受信データ パケットを読み取る net.Conn.Read を使用して生のネットワーク接続にアクセスできます。バイト配列に変換します。ただし、受信データの正確なサイズがわからない場合、固定サイズの配列に読み込むと、データの切り捨てや不必要なバッファリングが発生する可能性があります。

これに対処するには、次を使用してより柔軟なアプローチを採用できます。 bufio パッケージまたは代替手法。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート