Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Mencapai Komunikasi Dwi Arah Menggunakan Soket Unix dalam Go?
Anda sedang cuba untuk melaksanakan seni bina pelayan pelanggan yang mudah menggunakan soket Unix, tetapi anda telah menemui isu aliran data satu arah. Mari kita mendalami kod dan selesaikan masalahnya.
Dalam kod pelanggan anda, anda berjaya menghantar mesej kepada pelayan, tetapi pelayan gagal membalas. Ini menunjukkan bahawa anda kehilangan langkah penting: membaca respons pelayan. Dalam kod pelanggan yang disemak di bawah, kami telah menambahkan goroutine pembaca untuk mengendalikan data bacaan daripada pelayan.
// 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) } }
Di bahagian pelayan, kod anda kelihatan betul. Walau bagaimanapun, adalah mustahak untuk mengendalikan ralat dalam goroutine dan sambungan rapat apabila selesai, seperti yang ditunjukkan dalam kod pelayan yang diubah suai di bawah:
// 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) } }
Dengan pengubahsuaian ini dilaksanakan, komunikasi pelanggan-pelayan anda kini seharusnya menjadi dua-dua sepenuhnya. berarah, membenarkan data mengalir kedua-dua arah.
Atas ialah kandungan terperinci Bagaimana untuk Mencapai Komunikasi Dwi Arah Menggunakan Soket Unix dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!