ホームページ > バックエンド開発 > Golang > Go で Unix ソケットを使用して双方向通信を実現するにはどうすればよいですか?

Go で Unix ソケットを使用して双方向通信を実現するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-12-07 02:54:12
オリジナル
416 人が閲覧しました

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

Go の Unix ソケット: 双方向通信の確立

Unix ソケットを使用して単純なクライアント/サーバー アーキテクチャを実装しようとしていますが、一方向のデータ フローの問題。コードを詳しく調べて問題に対処しましょう。

クライアント コードでは、サーバーにメッセージを正常に送信していますが、サーバーは応答に失敗しています。これは、サーバーの応答を読み取るという重要なステップが欠けていることを示しています。以下の修正されたクライアント コードでは、サーバーからのデータの読み取りを処理するためのリーダー ゴルーチンを追加しました。

// 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)
    }
}
ログイン後にコピー

サーバー側では、コードは正しいように見えます。ただし、以下の変更されたサーバー コードに示すように、ゴルーチンでエラーを処理し、完了したら接続を閉じることが不可欠です。

// 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 ソケットを使用して双方向通信を実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート