TCP Read in Go: Menyelidiki Operasi Menyekat dan Tidak Menyekat
Dalam Go, kaedah Baca untuk sambungan TCP beroperasi secara bukan -cara menyekat. Ini menunjukkan bahawa operasi baca akan kembali serta-merta, walaupun data lengkap tidak tersedia. Ini boleh menimbulkan cabaran apabila cuba membaca jumlah data tertentu atau apabila berurusan dengan protokol yang memerlukan pemindahan data disegerakkan.
Mengapa Bacaan TCP Tidak Menyekat?
Rangkaian protokol komunikasi, seperti TCP, sememangnya mengendalikan data dalam cara seperti aliran. Ini bermakna data boleh dihantar dan diterima secara berkeping-keping, dan tiada sempadan yang wujud yang menyempadankan penghujung satu paket data.
Cara Mencapai Menyekat Baca dalam Go
Walaupun kaedah Baca tidak menyekat, terdapat teknik untuk mencapai tingkah laku seperti menyekat:
Mengurus Bacaan Separa
Dalam kes di mana jumlah data yang diterima daripada kaedah Baca adalah kurang daripada yang dijangkakan, adalah penting untuk menentukan pengendalian yang sesuai untuk bacaan separa. Protokol sering menggunakan pembatas atau mekanisme lain untuk menunjukkan penghujung paket data atau mesej.
Kod Contoh dengan Pengendalian Ralat
Dalam coretan kod yang disediakan, kaedah Baca tidak digunakan dengan betul. Kod harus diubah suai untuk mengambil kira ralat bacaan dan pengendalian separa:
<code class="go">// Server Code package main import ( "fmt" "log" "net" ) func main() { listener, err := net.ListenTCP("tcp", &net.TCPAddr{IP: net.ParseIP("127.0.0.1"), Port: 4243}) if err != nil { log.Fatal(err) } defer listener.Close() for { conn, err := listener.AcceptTCP() if err != nil { log.Fatal(err) } conn.SetNoDelay(false) data := make([]byte, 512) for { n, err := conn.Read(data) if err != nil { fmt.Println(err) break } fmt.Println(data[:n]) } } }</code>
<code class="go">// Client Code package main import ( "log" "net" ) func main() { conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{IP: net.ParseIP("127.0.0.1"), Port: 4243}) if err != nil { log.Fatal(err) } conn.SetNoDelay(false) conn.Write([]byte("Hello World")) }</code>
Ingat untuk menyemak ralat secara konsisten sepanjang kod anda untuk memastikan sebarang isu yang berpotensi dikenal pasti dan dikendalikan dengan segera.
Atas ialah kandungan terperinci Bagaimana untuk Mencapai Menyekat Operasi Baca TCP dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!