Go TCP Read Tidak Menyekat: Menangani Penerimaan Data Tidak Lengkap
Dalam Go, bacaan TCP tidak disekat, bermakna ia kembali serta-merta dengan sebarang data yang tersedia, walaupun ia kurang daripada yang dijangkakan. Tingkah laku ini berbeza daripada bacaan menyekat C, yang menunggu sehingga jumlah data yang diperlukan diterima.
Sebab Bacaan Tidak Menyekat
TCP beroperasi sebagai aliran bait , yang mungkin berpecah-belah semasa penghantaran. Oleh itu, adalah mustahil untuk menentukan penghujung mesej hanya berdasarkan bilangan bait yang diterima. Ini memerlukan pembatas tersuai atau mekanisme lain untuk menentukan sempadan mesej.
Penyelesaian kepada Data Tidak Lengkap
Untuk membaca bilangan bait tertentu, gunakan io.ReadAtLeast atau io.ReadFull . Untuk syarat sewenang-wenangnya, gelung pada panggilan Baca sehingga tiada ralat atau syarat yang ditentukan dipenuhi.
Contoh:
<code class="go">package main import ( "fmt" "net" "time" ) func main() { conn, _ := net.Dial("tcp", "127.0.0.1:4243") // Set a deadline to prevent hanging reads _ = conn.SetReadDeadline(time.Now().Add(10 * time.Second)) // Loop to read until a newline is encountered for { buf := make([]byte, 512) n, err := conn.Read(buf) if err != nil { fmt.Println(err) break } if n > 0 { str := string(buf[:n]) if str[len(str)-1] == '\n' { fmt.Println(str) break } } } }</code>
Pertimbangan Lain
Atas ialah kandungan terperinci Bagaimana untuk Mengendalikan Penerimaan Data Tidak Lengkap dalam Bacaan TCP Tidak Menyekat Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!