Ich versuche, einen Server und einen Client in Go zu machen, ich habe es geschafft, mit dem Server und dem Client zu kommunizieren. Aber das Problem, das ich habe, ist, dass das TCP-Einlesen von Golang nicht blockierend ist. Was ich gerne wissen würde, ob es möglich ist, dass der eingelesene Golang blockiert wie in C. Danke
BEARBEITEN:
Hier ist der Quellcode des Servers:
%Vor%und mein Kunde:
%Vor% Reader
s kann Teildaten zurückgeben. Von den Dokumenten , "Wenn einige Daten verfügbar sind, aber keine len (p) Bytes, gibt Read konventionell zurück, was stattdessen verfügbar ist warten auf mehr. "
Dies ist ein Problem in jeder Sprache, selbst wenn etwas in C für Sie funktioniert: TCP stellt nur einen Strom von Bytes zur Verfügung, die jederzeit beschrieben werden können. Einzelne Schreibvorgänge könnten von Grund auf in mehrere Pakete zur Übertragung aufgeteilt sein, und es gibt kein eingebautes Signal an den Empfänger, das sagt, wo eine einzelne Schreib / Nachricht / Anfrage endet. Die Anwendung muss einen eigenen Weg finden, Grenzen zu signalisieren. Das kann Delimiter ( \n
) oder implizite oder explizite Byte-Zählungen bedeuten (HTTP Content-Length
ist ein explizites Byte).
Um eine bestimmte Anzahl von Eingabebytes zu lesen, möchten Sie io.ReadAtLeast
oder io.ReadFull
. Um zu lesen, bis eine beliebige Bedingung erfüllt ist, sollten Sie den Read
-Aufruf so lange wiederholen, bis kein Fehler mehr auftritt. (Dann sollten Sie zu große Eingaben ausmerzen, um zu verhindern, dass ein schlechter Client Server-Ressourcen verschlingt.) Wenn Sie ein textbasiertes Protokoll implementieren, sollten Sie net/textproto
, was ein bufio.Reader
in den Vordergrund stellt der Verbindung, so dass Sie Zeilen lesen können. Um zu begrenzen, wie lange Sie warten müssen, bis Sie mit dem Lesen fertig sind (so dass sich ein mißgebildeter Client eine Goroutine nicht hängen lassen und Speicher usw. für immer benutzen kann), sehen Sie sich die net
Funktionen mit Deadline
im Namen (die mit den Funktionen Timeout
auf den Error
-Typen zusammenhängen). Das Paket context
hilft bei der Verwaltung von Zeitüberschreitungen, Fristen und Stornierungen und ist besonders nützlich, wenn Sie beispielsweise schreiben ein komplexer Server, der bei jeder Anfrage viele Netzwerkoperationen durchführt.
Der Beispielcode hat ein möglicherweise nicht zusammenhängendes, aber wichtiges Problem: Er verwirft Fehler von Read
und Write
. Das könnte einfache Probleme maskieren und sie sehr schwer zu debuggen machen. Wenn Sie nach der Überprüfung von Teillesevorgängen Probleme haben, prüfen Sie alle Fehler, bevor Sie weitere Hilfe anfordern. Schauen Sie sich errcheck
an, um sicherzustellen, dass Fehler wie diese nicht in Produktion gehen.