クライアントは、UNIX ドメイン ソケットを使用して別のクライアントとどのように通信できますか?

クライアントは、UNIX ドメイン ソケットを使用して別のクライアントとどのように通信できますか?

bash を使用すると、netcat で次のようになる場合があります。

nc -lk -U /my/fifo | while read line; do
   # line => {"client_id":123}
done;

クライアントは次のようなデータを送信します。

echo '{"client_id":123,"data":"foo"}' | nc -U /my/fifo

クライアントは次のようにデータを待機します。

echo '{"client_id":123}' | nc -U /my/fifo | while read line; do

done;

私の質問 - すべてのクライアントを関与させずに、あるクライアントから別のクライアントにデータを送信するにはどうすればよいですか? 「サーバー」では、各クライアントへの参照を保存する必要があります。そうすれば、あるクライアントからメッセージを受け取ったときに、そのメッセージを誰に転送するかがわかります。現在接続されているクライアントへの参照を保存するにはどうすればよいでしょうか? Websocket と同様に、そのチャネルに登録されているすべてのユーザーがメッセージを取得できるチャネルを作成したいと考えています。

答え1

つまり、私はクライアントに次のように応答できると思います:

echo "this is the response" | nc -lk -U /my/fifo

しかし、肝心なのは、クライアントが誰であるかに応じてどのように異なる対応をするかということです。つまり、クライアントのリクエストなどに基づいたロジックがなければ、非常に便利なものをどのように作成できるでしょうか?

私の推測では、サーバーは 2 つあるはずです。

nc -lk -U /my/fifo1 | while read line; do

  # custom logic goes here

done > nc -lk -U /my/fifo2

クライアントは次のように接続します:

echo '{"client_id":123}' | nc -U /my/fifo1 

nc -U /my/fifo2 | while read line; do

done; 

これは、tcp および unix ドメイン ソケットが Node.js などでどのように動作するかについての私の知識を裏切るものですが、bash ではこのようにする必要があるのでしょうか?

また、競合状態を回避するには、上記の 2 つのコマンドを何らかの方法で 1 つのパイプに配置する必要があると思います。

関連情報