Apabila melaksanakan soket Unix dalam Go, adalah penting untuk mewujudkan saluran komunikasi dua hala untuk membolehkan pelanggan dan pelayan menghantar dan menerima data . Artikel ini meneroka isu asas yang dihadapi apabila menggunakan soket Unix: sambungan satu arah yang membawa kepada penghantaran data hanya dalam satu arah.
Dalam contoh kod yang disediakan, pelayan boleh menerima data daripada pelanggan tetapi gagal bertindak balas dengan data. Isu ini berpunca daripada fakta bahawa panggilan c.Read() dalam kod klien tidak pernah disusuli dengan panggilan c.Write(). Akibatnya, pelanggan gagal membaca respons pelayan, mewujudkan ilusi sambungan satu arah.
Untuk mewujudkan komunikasi dua hala, kami perlu mengubah suai pelanggan dan pelayan kod.
Kod pelayan yang diubah suai memperkenalkan pernyataan penangguhan kepada mengendalikan menutup sambungan dengan anggun sekiranya berlaku ralat. Selain itu, kami menggunakan rehat untuk keluar dari goroutine pembaca apabila perlu.
package main import ( "log" "net" ) func echoServer(c net.Conn) { defer c.Close() 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) } }
Kod klien yang diubah suai menambah goroutine pembaca untuk terus membaca data masuk daripada pelayan. Kenyataan penangguhan memastikan sambungan ditutup apabila fungsi utama ditamatkan.
package main import ( "io" "log" "net" "time" ) func reader(r io.Reader) { defer r.(net.Conn).Close() // Ensure connection is closed even on panic 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 { log.Fatal(err) } go reader(c) for { _, err := c.Write([]byte("hi")) if err != nil { log.Fatal(err) break } time.Sleep(1e9) } }
Dengan pengubahsuaian ini, komunikasi pelanggan-pelayan menjadi dua arah, membolehkan kedua-dua pihak menghantar dan menerima data dengan lancar.
Atas ialah kandungan terperinci Bagaimana untuk Mencapai Komunikasi Dwiarah dengan Soket Unix dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!