Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Mencapai Komunikasi Dwi Arah Menggunakan Soket Unix dalam Go?

Bagaimana untuk Mencapai Komunikasi Dwi Arah Menggunakan Soket Unix dalam Go?

Linda Hamilton
Linda Hamiltonasal
2024-12-07 02:54:12434semak imbas

How to Achieve Bi-Directional Communication Using Unix Sockets in Go?

Soket Unix dalam Go: Mewujudkan Komunikasi Dwi Arah

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn