ホームページ > バックエンド開発 > Golang > Go Unix Socket Echo サーバーが切断されるのはなぜですか: 単方向通信の問題ですか?

Go Unix Socket Echo サーバーが切断されるのはなぜですか: 単方向通信の問題ですか?

DDD
リリース: 2024-12-02 21:16:12
オリジナル
166 人が閲覧しました

Why Does My Go Unix Socket Echo Server Disconnect: A Unidirectional Communication Problem?

Unix ソケットでの一方向通信: Echo サーバーの切断の解決

Go では、Unix ソケットはプロセス間通信のメカニズムを提供します。ただし、双方向接続を確立しようとすると、サーバーがクライアント メッセージを受信して​​も応答しなくなるという一般的な問題が発生します。

問題

よく見ると、この例に欠けている部分が明らかになります。クライアントコード。データをサーバーに送信する間、サーバーの応答を読み取りません。これに対処するコードを追加すると、問題が解決します。

修正されたクライアント コード

修正されたクライアント コードには、サーバーからデータを読み取る goroutine が含まれています。さらに、defer と Break を使用すると、ゴルーチンの適切なクリーンアップと終了が保証されます。

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

最終的な考察

クライアント コードに欠落している読み取り機能を実装することで、双方向通信が確立されます。クライアントがサーバーのメッセージを受信して​​応答できるようにします。このアプローチにより、エコー サーバーとクライアントが完全に機能することが保証されます。

以上がGo Unix Socket Echo サーバーが切断されるのはなぜですか: 単方向通信の問題ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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