In Go bieten Unix-Sockets einen Mechanismus für die Kommunikation zwischen Prozessen. Beim Versuch, eine bidirektionale Verbindung herzustellen, tritt jedoch häufig ein Problem auf, das dazu führt, dass der Server Client-Nachrichten empfängt, aber nicht darauf antwortet.
Bei näherer Betrachtung erkennt man, dass im Beispiel ein Teil fehlt Client-Code. Während es Daten an den Server überträgt, liest es nicht die Antwort des Servers. Durch Hinzufügen von Code zur Behebung dieses Problems wird das Problem behoben.
Der korrigierte Client-Code enthält eine Goroutine, die Daten vom Server liest. Darüber hinaus gewährleistet die Verwendung von „defer“ und „break“ eine ordnungsgemäße Bereinigung und Beendigung der Goroutine.
package main import ( "io" "log" "net" "time" ) func reader(r io.Reader) { buf := make([]byte, 1024) for { n, err := r.Read(buf[:]) if err != nil { return } println("Client got:", string(buf[0:n])) } } func main() { c, err := net.Dial("unix", "/tmp/echo.sock") if err != nil { panic(err) } defer c.Close() go reader(c) for { _, err := c.Write([]byte("hi")) if err != nil { log.Fatal("write error:", err) break } time.Sleep(1e9) } }
Durch die Implementierung der fehlenden Lesefunktionalität im Client-Code wird eine bidirektionale Kommunikation hergestellt. Ermöglichen, dass der Client die Nachrichten des Servers empfängt und darauf reagiert. Dieser Ansatz gewährleistet einen voll funktionsfähigen Echo-Server und -Client.
Das obige ist der detaillierte Inhalt vonWarum trennt mein Go Unix Socket Echo Server die Verbindung: Ein unidirektionales Kommunikationsproblem?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!