Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah saya boleh mencapai menyekat bacaan TCP dalam Go?

Bagaimanakah saya boleh mencapai menyekat bacaan TCP dalam Go?

Linda Hamilton
Linda Hamiltonasal
2024-11-03 01:29:30972semak imbas

How can I achieve blocking TCP reads in Go?

Bacaan TCP Menyekat lwn Tidak Menyekat dalam Go

Apabila bekerja dengan sambungan TCP dalam Go, operasi baca lazimnya tidak menyekat. Ini bermakna fungsi Baca kembali serta-merta, walaupun data belum tersedia. Walau bagaimanapun, dalam beberapa kes, operasi baca menyekat mungkin diingini yang menunggu sehingga data diterima.

Adakah Kemungkinan untuk Mendayakan Bacaan Menyekat dalam Go?

Walaupun fungsi Baca terbina dalam tidak menyekat, Go tidak menyediakan cara langsung untuk membuat penyekatan bacaan. Walau bagaimanapun, terdapat beberapa kaedah yang boleh mensimulasikan tingkah laku menyekat:

  • Menggunakan io.ReadAtLeast(): Fungsi ini menyekat sehingga bilangan bait yang ditentukan telah dibaca. Walau bagaimanapun, ia boleh menjadi tidak boleh dipercayai jika lebih banyak data tiba daripada yang dijangkakan.
  • Membaca dalam Gelung: Cara mudah untuk mensimulasikan bacaan menyekat adalah dengan memanggil berulang kali fungsi Baca dalam gelung sehingga data tersedia. Pendekatan ini lebih dipercayai tetapi boleh menggunakan sumber CPU tambahan.
  • Menggunakan Saluran: Pilihan lain ialah menggunakan saluran untuk menimbal data. Pelanggan akan menghantar data ke saluran dan menyekat sehingga ia diterima oleh pelayan.

Kod Contoh untuk Bacaan Penyekatan Simulasi

Berikut ialah contoh mensimulasikan bacaan menyekat menggunakan gelung:

<code class="go">func init_tcp() *net.TCPListener {
    laddr, err := net.ResolveTCPAddr("tcp", ":4243")
    if err != nil {
            log.Fatal(err)
    }
    tcp, err := net.ListenTCP("tcp", laddr)
    if err != nil {
            log.Fatal(err)
    }
    return tcp
}

func main() {
    tcp := init_tcp()
    conn, _ := tcp.Accept()
    data := make([]byte, 512)
    conn.SetNoDelay(false)
    for {
            // Repeat Read() until data is available
            for len(data) == 0 {
                    conn.Read(data)
            }
            fmt.Println(data)
            // Reset data for next iteration
            data = make([]byte, 512)
    }
}</code>

Kesimpulan

Walaupun bacaan TCP Go tidak disekat secara lalai, adalah mungkin untuk mensimulasikan tingkah laku menyekat menggunakan pelbagai teknik. Pendekatan terbaik bergantung pada keperluan khusus aplikasi. Perlu diingat bahawa penyekatan simulasi mungkin menimbulkan overhed atau kerumitan tambahan, jadi ia harus digunakan dengan bijak.

Atas ialah kandungan terperinci Bagaimanakah saya boleh mencapai menyekat bacaan TCP dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn