Die Lesefunktion in Go für TCP-Sockets verstehen
Wenn es um persistente TCP-Sockets geht, ist der Umgang mit eingehenden Daten einer der entscheidenden Aspekte effektiv. Die net.Conn.Read-Funktion wird häufig für diesen Zweck verwendet, wirft jedoch Fragen dazu auf, wie sie Nachrichtengrenzen bestimmt.
TCP Message Framing
Im Gegensatz zu anderen Kommunikationsprotokollen , TCP bietet von Natur aus kein Nachrichten-Framing. Es behandelt Daten als kontinuierlichen Bytestrom ohne Trennzeichen, die Nachrichtengrenzen angeben. Daher liegt es in der Verantwortung der Anwendungsschicht, einen Framing-Mechanismus zu definieren und zu implementieren.
Gos Ansatz
Gos Implementierung von net.Conn geht davon aus, dass das Message-Framing unter gehandhabt wird der Anwendungsebene. Es ermöglicht Anwendungen, einen rohen Bytestrom zu lesen und ihn basierend auf ihren definierten Protokollen zu interpretieren.
Beispielverwendung
Der in der Frage bereitgestellte Code zeigt, wie Daten mit empfangen werden net.Conn.Read in einer Schleife:
func (tcpSocket *TCPServer) HandleConnection(conn net.Conn) { for { // Read message size and data without any message framing messageSize, err := conn.Read(recieveBuffer) if err != nil { return } // ... } }
Das Problem tritt auf, weil der Code nicht explizit definiert, wie die Nachrichtengröße innerhalb der empfangenen Nachrichten bestimmt wird Byte-Stream.
Lösung: Bufio Reader und manuelles Parsen
Um dieses Problem zu beheben, wird empfohlen, die TCP-Verbindung in einen bufio.Reader einzubinden. Dies bietet effizientere und bequemere Methoden zum Parsen des Streams. Ein Beispiel, wie Sie Message Framing mit einem bufio.Reader implementieren könnten:
buff := make([]byte, 50) c := bufio.NewReader(conn) for { // Read message length from the first byte size, err := c.ReadByte() if err != nil { return err } // Read the remaining message data _, err := io.ReadFull(c, buff[:int(size)]) if err != nil { return err } fmt.Printf("Received %x\n", buff[:int(size)]) }
In diesem Beispiel lesen wir zunächst ein einzelnes Byte, um die Nachrichtengröße zu bestimmen. Dann verwenden wir io.ReadFull, um die verbleibenden Bytes der Nachricht zu lesen. Dieser Ansatz ermöglicht explizites Nachrichten-Framing und ermöglicht uns die Arbeit mit Nachrichten unterschiedlicher Größe.
Wenn Sie verstehen, wie TCP-Nachrichten-Framing funktioniert, und geeignete Tools wie bufio.Reader verwenden, können Sie eingehende Daten auf persistenten TCP-Sockets effektiv verarbeiten Los.
Das obige ist der detaillierte Inhalt vonWie geht die Funktion „net.Conn.Read' von Go mit TCP-Nachrichtengrenzen um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!