Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Mengendalikan Penerimaan Data Tidak Lengkap dalam Bacaan TCP Tidak Menyekat Go?

Bagaimana untuk Mengendalikan Penerimaan Data Tidak Lengkap dalam Bacaan TCP Tidak Menyekat Go?

DDD
DDDasal
2024-11-04 16:05:02603semak imbas

How to Handle Incomplete Data Reception in Go's Non-Blocking TCP Reads?

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

  • Kendalikan kemungkinan berbilang paket untuk satu tulis.
  • Gunakan pembatas atau kaedah lain untuk mentakrifkan sempadan mesej.
  • Pertimbangkan untuk menggunakan net/textproto untuk protokol berasaskan teks.
  • Laksanakan tamat masa atau tarikh akhir untuk mengelakkan kebuluran sumber.
  • Semak semua ralat daripada operasi rangkaian untuk mengelakkan penyamaran masalah.

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!

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