Heim > Backend-Entwicklung > Golang > Wie erreicht man das Blockieren von TCP-Lesevorgängen in Go?

Wie erreicht man das Blockieren von TCP-Lesevorgängen in Go?

Linda Hamilton
Freigeben: 2024-11-03 14:03:31
Original
803 Leute haben es durchsucht

How to Achieve Blocking TCP Read Operations in Go?

TCP Read in Go: Eintauchen in blockierende und nicht blockierende Vorgänge

In Go arbeitet die Read-Methode für TCP-Verbindungen in einem Non -blockierende Weise. Dies bedeutet, dass der Lesevorgang sofort zurückkehrt, auch wenn nicht die vollständigen Daten verfügbar sind. Dies kann zu Herausforderungen führen, wenn Sie versuchen, bestimmte Datenmengen zu lesen, oder wenn Sie mit Protokollen arbeiten, die synchronisierte Datenübertragungen erfordern.

Warum ist TCP Read Non-Blocking?

Netzwerk Kommunikationsprotokolle wie TCP verarbeiten Daten von Natur aus stromartig. Dies bedeutet, dass Daten in Teilen gesendet und empfangen werden können und es keine inhärente Grenze gibt, die das Ende eines einzelnen Datenpakets markiert.

So erreichen Sie Blocking Read in Go

Während die Read-Methode nicht blockierend ist, gibt es Techniken, um ein blockierendes Verhalten zu erreichen:

  • io.ReadAtLeast: Diese Methode liest eine Mindestanzahl von Bytes aus der Verbindung. Wenn die Verbindung nicht sofort genügend Daten bereitstellt, blockiert die Methode, bis die angeforderten Daten empfangen werden.
  • io.ReadFull: Diese Methode liest genau die angegebene Anzahl an Bytes aus der Verbindung. Wenn die Verbindung nicht sofort genügend Daten bereitstellt, wird die Methode blockiert, bis die gesamten Daten empfangen wurden.

Verwaltung teilweiser Lesevorgänge

In Fällen, in denen die Menge Da die Anzahl der von der Read-Methode empfangenen Daten geringer ist als erwartet, ist es wichtig, die geeignete Behandlung für Teillesevorgänge zu bestimmen. Protokolle verwenden häufig Trennzeichen oder andere Mechanismen, um das Ende eines Datenpakets oder einer Nachricht anzuzeigen.

Beispielcode mit Fehlerbehandlung

In den bereitgestellten Codeausschnitten die Read-Methode nicht ordnungsgemäß verwendet wird. Der Code sollte geändert werden, um teilweise Lesevorgänge zu berücksichtigen und Fehler zu behandeln:

<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>
Nach dem Login kopieren
<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>
Nach dem Login kopieren

Denken Sie daran, den gesamten Code konsequent auf Fehler zu überprüfen, um sicherzustellen, dass potenzielle Probleme umgehend erkannt und behoben werden.

Das obige ist der detaillierte Inhalt vonWie erreicht man das Blockieren von TCP-Lesevorgängen in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage