Memahami Fungsi Baca dalam Go for TCP Socket
Apabila bercakap tentang soket TCP yang berterusan, salah satu aspek penting ialah mengendalikan data masuk dengan berkesan. Fungsi net.Conn.Read biasanya digunakan untuk tujuan ini, tetapi ia menimbulkan persoalan tentang cara ia menentukan sempadan mesej.
Pembingkaian Mesej TCP
Tidak seperti protokol komunikasi lain , TCP sememangnya tidak menyediakan pembingkaian mesej. Ia menganggap data sebagai aliran bait yang berterusan tanpa sebarang pembatas yang menunjukkan sempadan mesej. Oleh itu, adalah menjadi tanggungjawab lapisan aplikasi untuk mentakrif dan melaksanakan mekanisme pembingkaian.
Pendekatan Go
Pelaksanaan net.Conn Goo menganggap bahawa pembingkaian mesej dikendalikan pada tahap permohonan. Ia membenarkan aplikasi membaca strim bait mentah dan mentafsirnya berdasarkan protokol yang ditetapkan.
Contoh Penggunaan
Kod yang disediakan dalam soalan menunjukkan cara menerima data menggunakan net.Conn.Baca dalam satu gelung:
func (tcpSocket *TCPServer) HandleConnection(conn net.Conn) { for { // Read message size and data without any message framing messageSize, err := conn.Read(recieveBuffer) if err != nil { return } // ... } }
Isu timbul kerana kod tidak mentakrifkan secara eksplisit cara saiz mesej ditentukan dalam strim bait yang diterima.
Penyelesaian: Pembaca Bufio dan Penghuraian Manual
Untuk menangani isu ini, adalah disyorkan untuk membungkus sambungan TCP dalam bufio .Pembaca. Ini menyediakan kaedah yang lebih cekap dan mudah untuk menghuraikan strim. Contoh cara anda boleh melaksanakan pembingkaian mesej menggunakan bufio.Reader:
buff := make([]byte, 50) c := bufio.NewReader(conn) for { // Read message length from the first byte size, err := c.ReadByte() if err != nil { return err } // Read the remaining message data _, err := io.ReadFull(c, buff[:int(size)]) if err != nil { return err } fmt.Printf("Received %x\n", buff[:int(size)]) }
Dalam contoh ini, kita mula-mula membaca satu bait untuk menentukan saiz mesej. Kemudian, kami menggunakan io.ReadFull untuk membaca baki bait mesej. Pendekatan ini menyediakan pembingkaian mesej yang jelas dan membolehkan kami bekerja dengan mesej dengan saiz yang berbeza.
Dengan memahami cara pembingkaian mesej TCP berfungsi dan menggunakan alatan yang sesuai seperti bufio.Reader, anda boleh mengendalikan data masuk dengan berkesan pada soket TCP yang berterusan dalam Pergi.
Atas ialah kandungan terperinci Bagaimanakah Fungsi `net.Conn.Read` Go Mengendalikan Sempadan Mesej TCP?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!