Gehen Sie TCP-Lesen ist non-blocking
Ich versuche, einen server und einen client in Gehen, ich habe es geschafft, die Kommunikation mit dem server und client. Aber das problem das ich habe ist, dass die TCP-Lesen in golang nicht blockiert.
Was würde ich gerne wissen, ob es möglich ist für das Lesen in golang zu blockieren, wie das Lesen in C.
Danke
EDIT:
Hier ist der source code von der server:
func Init_tcp() *net.TCPListener {
laddr, err := net.ResolveTCPAddr("tcp", ":4243")
if err != nil {
log.Fatal(err)
}
tcp, err := net.ListenTCP("tcp", laddr)
if err != nil {
log.Fatal(err)
}
return tcp
}
func main() {
tcp := Init_tcp()
conn, _ := tcp.Accept()
data := make([]byte, 512)
conn.SetNoDelay(false)
for {
conn.Read(data)
fmt.Println(data)
}
}
und mein client:
func Init_tcp() *net.TCPConn {
laddr, err := net.ResolveTCPAddr("tcp", "127.0.0.1:4243")
if err != nil {
log.Fatal(err)
}
tcp, err := net.DialTCP("tcp", nil, laddr)
if err != nil {
log.Fatal(err)
}
return tcp
}
func main() {
tcp := Init_tcp()
tcp.Write([]byte("hello world"))
}
- Zeigen Sie Ihren code
*net.TCPConn
blockiert aufRead
-- mit einem optionalen timeout. - Ich habe gerade editiert meinen post mit meiner Quelle
- Mai wurden zunächst unklar, wirft aber ein echtes Problem für den Umgang mit einem Teil der Daten aus
Read
(vor allem aus Netzwerk-verbindungen). Fühlt sich nicht wie ein -2 überarbeitet. - Ich denke, dass Ihr wirkliches problem ist das ignorieren der Fehler aus Lesen. Sobald Ihr client beendet wird, der schreiben socket geschlossen wird, kann das Lesen beginnen, Fehler zurückgeben, was in, was scheint, eine unendliche Schleife. Denken Sie daran, dass Lesen können, die Daten zurückgeben, ein Graf UND ein Fehler in den gleichen Anruf. Und Sie haben, um mit alle von Ihnen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Reader
s zurückkehren können teilweise Daten. Von die docs, "Wenn einige Daten vorhanden, aber nicht len(p) bytes zu Lesen, die konventionell gibt, was verfügbar ist, anstatt zu warten, für mehr."Dies ist ein Problem in jeder Sprache, selbst wenn so etwas passiert ist, für Sie zu arbeiten in den C: TCP stellt nur einen stream von bytes, die geschrieben werden können, zu jeder Zeit. Single schreibt könnte, durch design, aufgeteilt in mehrere Pakete für die übertragung, und es gibt keine built-in signal an den Empfänger zu sagen, wo ein einzelner schreib - /Meldung/Anfrage endet. Die Anwendung hat, um herauszufinden, Ihren eigenen Weg, um zu signalisieren Grenzen. Das kann bedeuten, Trennzeichen (
\n
) oder impliziten oder expliziten byte-Anzahl (HTTP istContent-Length
ist eine explizite Regel).Lesen einer bestimmten Anzahl von Eingabe-bytes, die Sie wollen
io.ReadAtLeast
oderio.ReadFull
. Zu Lesen, bis einige willkürliche Bedingung erfüllt ist, sollte man einfach Schleife auf derRead
nennen, solange kein Fehler vorhanden ist. (Dann können Sie auch Fehler auf, die auf zu große Eingänge, um zu verhindern, dass eine schlechte client-server-Ressourcen aus Essen.) Wenn Sie die Implementierung einer text-basiertes Protokoll, sollten Sie überlegen,net/textproto
, wodurch sich einebufio.Reader
vor die Verbindung, so können Sie die Zeilen gelesen. Begrenzen, wie lange Sie warten, zu Ende Lesen (so dass ein Fehlverhalten der client nicht verlassen kann, eine goroutine hängen und mit memory, etc. für immer), Blick auf dienet
Funktionen mitDeadline
im Namen (die im Zusammenhang mit derTimeout
Funktionen auf derError
Arten). Diecontext
- Paket hilft bei der Verwaltung der timeouts, Fristen und Storno -, und ist besonders nützlich, wenn, zum Beispiel, Sie schreiben eine komplexe server -, dass sich viele Netzwerk-Operationen pro Anfrage.Den Beispiel-code hat einen möglicherweise nicht verwandten, aber wichtiges problem: es wirft Weg Fehler aus der
Read
undWrite
. Das könnte Maske, einfache Probleme und machen Sie sehr schwierig zu Debuggen. Wenn Sie Probleme haben, nachdem die Buchhaltung für das teilweise liest, überprüfen Sie alle Fehler, bevor Sie zu Fragen für weitere Hilfe. Blick auferrcheck
, um sicherzustellen, dass Fehler wie dieser nicht in die Produktion bekommen.