Memahami Pembingkaian Mesej Soket TCP: Peranan bufio.Reader
Dalam kod pelayan Go anda, anda menyatakan kekeliruan tentang cara net.Conn .Baca mengesan penghujung mesej yang diterima melalui soket TCP yang berterusan. Tidak seperti protokol seperti HTTP, TCP sendiri tidak menyediakan sebarang mekanisme pembingkaian mesej semula jadi. Tanggungjawab aplikasi untuk melaksanakan protokolnya sendiri untuk merangka mesej.
Masukkan bufio.Reader: Mempertingkatkan Pengendalian Strim
Untuk memudahkan pengendalian strim yang cekap dan fleksibel, Go menyediakan bufio.Jenis pembaca. Membungkus sambungan TCP anda dalam bufio.Reader menawarkan beberapa kelebihan:
Contoh Pembingkaian Mesej dengan bufio.Pembaca:
Berikut ialah contoh yang menunjukkan cara anda boleh menggunakan bufio.Reader untuk menghuraikan mesej dalam anda Pelayan TCP:
package main import ( "bufio" "fmt" "net" ) func main() { ln, err := net.Listen("tcp", ":8080") if err != nil { // Handle error } for { conn, err := ln.Accept() if err != nil { // Handle error } go handleConnection(conn) } } func handleConnection(conn net.Conn) { defer conn.Close() // Wrap the connection in a bufio.Reader buff := make([]byte, 50) c := bufio.NewReader(conn) for { // Read a single byte representing the message length size, err := c.ReadByte() if err != nil { // Handle error } // Read the message according to its size _, err = io.ReadFull(c, buff[:int(size)]) if err != nil { // Handle error } // Process the received message fmt.Printf("Received message: %x\n", buff[:int(size)]) } }
Dalam contoh ini, setiap mesej mempunyai bait pengepala yang menentukan panjangnya. Menggunakan bufio.ReadByte(), kami mula-mula membaca panjang dan kemudian menggunakan io.ReadFull untuk membaca seluruh mesej berdasarkan panjang yang ditentukan. Ini membolehkan anda menghuraikan mesej dengan pelbagai saiz dengan cekap.
Atas ialah kandungan terperinci Bagaimanakah bufio.Reader Menyelesaikan Pembingkaian Mesej Soket TCP dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!