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 サイトの他の関連記事を参照してください。