Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Mencapai Menyekat Operasi Baca TCP dalam Go?

Bagaimana untuk Mencapai Menyekat Operasi Baca TCP dalam Go?

Linda Hamilton
Linda Hamiltonasal
2024-11-03 14:03:31743semak imbas

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>
<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>

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!

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