Go 中的雙向 Unix Socket 通訊
Unix 套接字提供了一種在系統內實現進程間通訊的便捷機制。在 Go 中,可以使用 net 套件執行網路操作。有時,當嘗試使用 Unix 套接字建立雙向通訊時,可能會出現只有一個方向在運作的情況。
導致此行為的一個可能原因是錯誤處理不足。在給定的範例中,伺服器的寫入操作缺乏錯誤處理,導致潛在的資料遺失。透過在寫入操作期間發生錯誤時添加恐慌,我們確保任何資料遺失都會立即顯現出來。
此外,在客戶端的 goroutine 中,缺乏對讀取操作的錯誤處理,導致客戶端無法接收伺服器發送的任何資料。包括錯誤處理並添加對單獨的讀取器 goroutine 的呼叫來處理來自伺服器的傳入資料可以解決此問題。
這是範例的修改版本,其中包含必要的錯誤處理調整:
package main import ( "log" "net" ) func echoServer(c net.Conn) { for { buf := make([]byte, 512) nr, err := c.Read(buf) if err != nil { return } data := buf[0:nr] println("Server got:", string(data)) _, err = c.Write(data) if err != nil { log.Fatal("Write: ", 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) } }
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) } }
完成這些修改後,客戶端和伺服器之間建立雙向通信,允許透過Unix發送和接收資料插座。
以上是為什麼我的 Go Unix Socket 只能以一種方式通訊?的詳細內容。更多資訊請關注PHP中文網其他相關文章!