Golang: TCP-Client / Server-Datenbegrenzer

Not sure, wie man die Frage formuliert und wenn sie wirklich nur geht, um Sprache zu gehen, aber was ich versuche, ist, einen TCP-Bediener und -klienten zu haben, die Daten zwischen austauschen, im Allgemeinen strömt der Klient große Mengen Daten in Bei kleineren Datenblöcken wartet der Server, bis er alle Datenblöcke gelesen hat, und antwortet dann mit einem Statuscode, der vom Client gelesen wird und auf der Grundlage dessen andere Aufgaben ausführt.

Ich benutze die unten stehende Funktion alsPrüfun, um die Daten von Client und Server zu lesen (bitte beachten Sie, dass ich weiß, dass das nicht perfekt ist, aber es ist nur ein Test):

func createBufferFromConn(conn net.Conn) *bytes.Buffer {
    buffer := &bytes.Buffer{}
    doBreak := false
    for {
        incoming := make([]byte, BUFFER_SIZE)

        conn.SetReadDeadline(time.Now().Add(time.Second * 2))
        bytesRead, err := conn.Read(incoming)
        conn.SetReadDeadline(time.Time{})

        if err != nil {
            if err == io.EOF {
                fmt.Println(err)
            } else if neterr, ok := err.(net.Error); ok && neterr.Timeout() {
                fmt.Println(err)
            }
            doBreak = true
        }

        if doBreak == false && bytesRead == 0 {
            continue
        }

        if bytesRead > 0 {
            buffer.Write(incoming[:bytesRead])
            if bytes.HasSuffix(buffer.Bytes(), []byte("|")) {
                bb := bytes.Trim(buffer.Bytes(), "|")
                buffer.Reset()
                buffer.Write(bb)
                doBreak = true
            }
        }

        if doBreak {
            break
        }
    }
    return buffer
}

Now in meinem Fall, wenn ich über Telnet verbinden (der Go-Code enthält auch einclient(), um eine Verbindung zum @ herzustellserver()) und ich tippe so etwas wietest 12345| fairerweise funktioniert alles einwandfrei und der Puffer enthält alle von Telnet geschriebenen Bytes (mit Ausnahme der Pipe, die durch den Trim () - Aufruf entfernt wird).

Wenn ich das @ entferif bytes.HasSuffix(buffer.Bytes(), []byte("|")) { Block aus dem Code, dann bekomme ich nach 2 Sekunden wieder eine Zeitüberschreitung, wie erwartet, weil in dieser Zeit keine Daten empfangen werden und der Server die Verbindung schließt, und wenn ich keine Lesefrist für die Verbindung festgelegt habe, Es wird ewig warten, um Daten zu lesen, und wird nie wissen, wann es zu stoppen ist.

Ich denke, meine Frage ist, wenn ich mehrere Datenblöcke sende, muss ich einen eigenen Begrenzer angeben, damit ich weiß, wann ich das Lesen von der Verbindung beenden und nicht ewig warten oder warten muss, bis der Server die Verbindung abbricht?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage