Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah bufio.Reader Menyelesaikan Pembingkaian Mesej Soket TCP dalam Go?

Bagaimanakah bufio.Reader Menyelesaikan Pembingkaian Mesej Soket TCP dalam Go?

Susan Sarandon
Susan Sarandonasal
2024-11-25 19:49:11730semak imbas

How Does bufio.Reader Solve TCP Socket Message Framing in Go?

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:

  • Peningkatan Kecekapan I/O: bufio.Reader menggunakan teknik penimbal untuk meminimumkan panggilan sistem dan penyalinan data, menghasilkan operasi I/O yang lebih pantas.
  • Diringkaskan Pembingkaian: Ia menyediakan kaedah yang mudah untuk membaca data secara berstruktur, menjadikannya lebih mudah untuk menghuraikan mesej mengikut protokol anda.

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!

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