ホームページ >バックエンド開発 >Golang >Golang を使用して net.Conn から正確な量のデータを読み取るにはどうすればよいですか?

Golang を使用して net.Conn から正確な量のデータを読み取るにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-09 09:17:021057ブラウズ

How can I read the exact amount of data from a net.Conn using Golang?

Golang net.Conn.Read を使用した正確な量のデータの読み取り

Go でネットワーク アプリケーションを操作する場合、net.Conn.Read メソッドは便利な方法を提供します。接続からデータを受信します。ただし、事前に決定されたバイト配列を読み取ることで動作するため、開発者は正確なデータ長を予測するという課題が残ります。

固定長バイト配列に関する潜在的な問題

固定長バイト配列の指定make([]byte, 2048) などの -length バイト配列では、2 つの可能性が考えられます。問題:

  1. データ オーバーラン: 受信データが割り当てられたバッファ サイズを超えると、データが切り捨てられ、データ損失が発生します。
  2. 不十分スペース: 割り当てられたバッファーが必要以上に大きい場合、メモリの浪費や不必要な処理が発生する可能性があります。

正確な読み取りのための io.Copy の使用

これらの制限を克服するには、io.Copy 関数を利用できます。これは、2 つの間でデータを転送する堅牢かつ効率的なアプローチを提供します。 io互換接続。 bytes.Buffer オブジェクトを作成し、net.Conn からのデータをそれにパイプすることで、必要に応じて動的にバッファーを拡張し、正確な量のデータが確実にキャプチャされるようにすることができます。

コード例

これは、正確なデータ読み取りのために io.Copy を使用する方法を示すコード スニペットの例です。

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()
    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())
}

この例では、 Google の Web サーバーに TCP 接続し、HTTP リクエストを送信し、bytes.Buffer と io.Copy を使用して応答データを動的にキャプチャします。結果として得られる buf オブジェクトには完全な応答が含まれており、転送されたデータの正確な量を確実に読み取ることができます。

このアプローチを利用することで、事前定義されたバイト配列による制限を受けることなく、ネットワーク接続からデータを確実に受信できます。

以上がGolang を使用して net.Conn から正確な量のデータを読み取るにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。