首页 > 后端开发 > Golang > 如何在Go中使用Unix Sockets实现双向通信?

如何在Go中使用Unix Sockets实现双向通信?

Linda Hamilton
发布: 2024-12-07 02:54:12
原创
416 人浏览过

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

Go 中的 Unix 套接字:建立双向通信

您正在尝试使用 Unix 套接字实现简单的客户端-服务器架构,但是您遇到了单向数据流问题。让我们深入研究代码并解决问题。

在您的客户端代码中,您已成功向服务器发送消息,但服务器无法响应。这表明您错过了一个关键步骤:读取服务器的响应。在下面修改后的客户端代码中,我们添加了一个 reader goroutine 来处理从服务器读取数据。

// 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)
    }
}
登录后复制

在服务器端,您的代码看起来是正确的。然而,必须处理 goroutine 中的错误并在完成后关闭连接,如下面修改后的服务器代码所示:

// 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)
    }
}
登录后复制

完成这些修改后,您的客户端-服务器通信现在应该是完全双向的定向的,允许数据双向流动。

以上是如何在Go中使用Unix Sockets实现双向通信?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板