TCP-Socket-Message-Framing verstehen: Die Rolle von bufio.Reader
In Ihrem Go-Servercode haben Sie Verwirrung darüber zum Ausdruck gebracht, wie net.Conn .Read erkennt das Ende einer über einen dauerhaften TCP-Socket empfangenen Nachricht. Im Gegensatz zu Protokollen wie HTTP bietet TCP selbst keinen natürlichen Nachrichtenrahmenmechanismus. Es liegt in der Verantwortung der Anwendung, ihr eigenes Protokoll zum Framing von Nachrichten zu implementieren.
Geben Sie bufio ein.Reader: Verbesserung der Stream-Verarbeitung
Um eine effiziente und flexible Stream-Verarbeitung zu ermöglichen, bietet Go die bufio.Reader-Typ. Das Einschließen Ihrer TCP-Verbindung in einen bufio.Reader bietet mehrere Vorteile:
Beispiel für Message Framing mit bufio.Reader:
Hier ist ein Beispiel dafür demonstriert, wie Sie bufio.Reader verwenden können, um Nachrichten auf Ihrem TCP-Server zu analysieren:
package main import ( "bufio" "fmt" "net" ) func main() { ln, err := net.Listen("tcp", ":8080") if err != nil { // Handle error } for { conn, err := ln.Accept() if err != nil { // Handle error } go handleConnection(conn) } } func handleConnection(conn net.Conn) { defer conn.Close() // Wrap the connection in a bufio.Reader buff := make([]byte, 50) c := bufio.NewReader(conn) for { // Read a single byte representing the message length size, err := c.ReadByte() if err != nil { // Handle error } // Read the message according to its size _, err = io.ReadFull(c, buff[:int(size)]) if err != nil { // Handle error } // Process the received message fmt.Printf("Received message: %x\n", buff[:int(size)]) } }
Hier Beispielsweise verfügt jede Nachricht über ein Header-Byte, das ihre Länge angibt. Mit bufio.ReadByte() lesen wir zunächst die Länge und lesen dann mit io.ReadFull den Rest der Nachricht basierend auf der angegebenen Länge. Dadurch können Sie Nachrichten unterschiedlicher Größe effizient analysieren.
Das obige ist der detaillierte Inhalt vonWie löst bufio.Reader das TCP-Socket-Message-Framing in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!