Bagaimana untuk Mengendalikan Sambungan TCP Berterusan dan Pembingkaian Data dengan Cekap dalam Go?

Patricia Arquette
Lepaskan: 2024-11-24 09:17:20
asal
144 orang telah melayarinya

How to Efficiently Handle Persistent TCP Connections and Data Framing in Go?

Cara Mengendalikan Soket TCP Persistent dengan net.Conn.Read in Go

Pengenalan:

Mengurus sambungan TCP yang berterusan dalam Go melibatkan pengendalian data masuk dengan berkesan. Artikel ini menangani salah tanggapan biasa tentang net.Conn.Read dan menyediakan penyelesaian praktikal untuk menghuraikan data daripada sambungan TCP berasaskan strim.

Memahami Pembingkaian Data TCP:

TCP ialah protokol berasaskan aliran yang tidak menyediakan sebarang pembingkaian mesej. Ini bermakna bahawa menentukan sempadan mesej individu dalam aliran data masuk adalah tanggungjawab aplikasi.

Salah Tanggapan Biasa:

Salah tanggapan yang biasa ialah net.Conn .Baca secara automatik mengetahui penghujung mesej dan diteruskan dengan sewajarnya. Walau bagaimanapun, ini tidak berlaku.

Pembingkaian Mesej Tersuai:

Untuk menghuraikan data secara berkesan daripada strim TCP, protokol pembingkaian mesej tersuai mesti ditentukan. Ini boleh dicapai dengan menambahkan pengepala pada setiap mesej yang menunjukkan panjangnya.

bufio.Reader to Enhance Efficiency:

Untuk meningkatkan kecekapan membaca dan menyediakan kaedah tambahan untuk menghuraikan, adalah disyorkan untuk membalut sambungan dalam a bufio.Reader.

Penyelesaian:

Coretan kod berikut memberikan contoh cara menghuraikan mesej dengan pembingkaian tersuai:

import (
    "bufio"
    "fmt"
    "io"
    "net"
)

func main() {
    ln, err := net.Listen("tcp", ":8080")
    if err != nil {
        fmt.Println(err)
        return
    }

    for {
        conn, err := ln.Accept()
        if err != nil {
            fmt.Println(err)
            return
        }

        // Wrap the connection in a bufio.Reader
        br := bufio.NewReader(conn)

        for {
            // Read a single byte containing the message length
            size, err := br.ReadByte()
            if err != nil {
                fmt.Println(err)
                return
            }

            // Read the full message
            buff := make([]byte, size)
            _, err = io.ReadFull(br, buff)
            if err != nil {
                fmt.Println(err)
                return
            }

            fmt.Printf("Received: %x\n", buff)
        }
    }
}
Salin selepas log masuk

Kesimpulan:

Dengan menentukan protokol pembingkaian mesej tersuai dan menggunakan bufio.Reader, adalah mungkin untuk mengendalikan soket TCP berterusan dengan berkesan dalam Go. Pendekatan ini membolehkan penghuraian data yang cekap dan komunikasi yang mantap melalui strim TCP.

Atas ialah kandungan terperinci Bagaimana untuk Mengendalikan Sambungan TCP Berterusan dan Pembingkaian Data dengan Cekap dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan