Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Mencapai Komunikasi Dwiarah dengan Soket Unix dalam Go?

Bagaimana untuk Mencapai Komunikasi Dwiarah dengan Soket Unix dalam Go?

Mary-Kate Olsen
Lepaskan: 2024-12-02 01:25:11
asal
979 orang telah melayarinya

How to Achieve Bidirectional Communication with Unix Sockets in Go?

Soket Unix Dwiarah dalam Go

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.

Memahami Masalah

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.

Menyelesaikan Isu

Untuk mewujudkan komunikasi dua hala, kami perlu mengubah suai pelanggan dan pelayan kod.

Pengubahsuaian Pelayan

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)
    }
}
Salin selepas log masuk

Pengubahsuaian Pelanggan

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)
    }
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan