您正在尝试使用 Unix 套接字实现简单的客户端-服务器架构,但是您遇到了单向数据流问题。让我们深入研究代码并解决问题。
在您的客户端代码中,您已成功向服务器发送消息,但服务器无法响应。这表明您错过了一个关键步骤:读取服务器的响应。在下面修改后的客户端代码中,我们添加了一个 reader goroutine 来处理从服务器读取数据。
// Client code with a reader 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) } }
在服务器端,您的代码看起来是正确的。然而,必须处理 goroutine 中的错误并在完成后关闭连接,如下面修改后的服务器代码所示:
// Server code with error handling and connection closing package main import ( "log" "net" ) func echoServer(c net.Conn) { defer c.Close() // Ensure connection is closed when the goroutine exits for { buf := make([]byte, 512) nr, err := c.Read(buf) if err != nil { log.Fatal("read error:", err) } data := buf[0:nr] _, err = c.Write(data) if err != nil { log.Fatal("write error:", err) } } } func main() { l, err := net.Listen("unix", "/tmp/echo.sock") if err != nil { log.Fatal("listen error:", err) } for { fd, err := l.Accept() if err != nil { log.Fatal("accept error:", err) } go echoServer(fd) } }
完成这些修改后,您的客户端-服务器通信现在应该是完全双向的定向的,允许数据双向流动。
以上是如何在Go中使用Unix Sockets实现双向通信?的详细内容。更多信息请关注PHP中文网其他相关文章!