Bagaimana untuk Mencapai Menyekat Operasi Baca TCP dalam Go?

Linda Hamilton
Lepaskan: 2024-11-03 14:03:31
asal
701 orang telah melayarinya

How to Achieve Blocking TCP Read Operations in Go?

TCP Read in Go: Menyelidiki Operasi Menyekat dan Tidak Menyekat

Dalam Go, kaedah Baca untuk sambungan TCP beroperasi secara bukan -cara menyekat. Ini menunjukkan bahawa operasi baca akan kembali serta-merta, walaupun data lengkap tidak tersedia. Ini boleh menimbulkan cabaran apabila cuba membaca jumlah data tertentu atau apabila berurusan dengan protokol yang memerlukan pemindahan data disegerakkan.

Mengapa Bacaan TCP Tidak Menyekat?

Rangkaian protokol komunikasi, seperti TCP, sememangnya mengendalikan data dalam cara seperti aliran. Ini bermakna data boleh dihantar dan diterima secara berkeping-keping, dan tiada sempadan yang wujud yang menyempadankan penghujung satu paket data.

Cara Mencapai Menyekat Baca dalam Go

Walaupun kaedah Baca tidak menyekat, terdapat teknik untuk mencapai tingkah laku seperti menyekat:

  • io.ReadAtLeast: Kaedah ini membaca bilangan bait minimum daripada sambungan. Jika sambungan tidak memberikan data yang mencukupi serta-merta, kaedah akan menyekat sehingga data yang diminta diterima.
  • io.ReadFull: Kaedah ini membaca dengan tepat bilangan bait yang ditentukan daripada sambungan. Jika sambungan tidak memberikan data yang mencukupi serta-merta, kaedah akan menyekat sehingga keseluruhan data diterima.

Mengurus Bacaan Separa

Dalam kes di mana jumlah data yang diterima daripada kaedah Baca adalah kurang daripada yang dijangkakan, adalah penting untuk menentukan pengendalian yang sesuai untuk bacaan separa. Protokol sering menggunakan pembatas atau mekanisme lain untuk menunjukkan penghujung paket data atau mesej.

Kod Contoh dengan Pengendalian Ralat

Dalam coretan kod yang disediakan, kaedah Baca tidak digunakan dengan betul. Kod harus diubah suai untuk mengambil kira ralat bacaan dan pengendalian separa:

<code class="go">// Server Code
package main

import (
    "fmt"
    "log"
    "net"
)

func main() {
    listener, err := net.ListenTCP("tcp", &net.TCPAddr{IP: net.ParseIP("127.0.0.1"), Port: 4243})
    if err != nil {
        log.Fatal(err)
    }
    defer listener.Close()
    for {
        conn, err := listener.AcceptTCP()
        if err != nil {
            log.Fatal(err)
        }
        conn.SetNoDelay(false)
        data := make([]byte, 512)
        for {
            n, err := conn.Read(data)
            if err != nil {
                fmt.Println(err)
                break
            }
            fmt.Println(data[:n])
        }
    }
}</code>
Salin selepas log masuk
<code class="go">// Client Code
package main

import (
    "log"
    "net"
)

func main() {
    conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{IP: net.ParseIP("127.0.0.1"), Port: 4243})
    if err != nil {
        log.Fatal(err)
    }
    conn.SetNoDelay(false)
    conn.Write([]byte("Hello World"))
}</code>
Salin selepas log masuk

Ingat untuk menyemak ralat secara konsisten sepanjang kod anda untuk memastikan sebarang isu yang berpotensi dikenal pasti dan dikendalikan dengan segera.

Atas ialah kandungan terperinci Bagaimana untuk Mencapai Menyekat Operasi Baca TCP 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