Как клиент может общаться с другим клиентом, используя доменные сокеты 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;

мой вопрос - как я могу отправлять данные от одного клиента другому клиенту, не вовлекая всех клиентов? На "сервере" мне нужно будет хранить ссылку на каждого клиента, чтобы, когда я получаю сообщение от одного клиента, я знал, кому переслать сообщение? Как я могу хранить ссылку на клиентов, которые в данный момент подключены? Так же, как и в веб-сокетах, я хочу создавать каналы, где любой зарегистрированный на этом канале получит сообщение.

решение1

Так вот в чем дело. Думаю, я могу ответить клиентам:

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

но вся суть в том, как мне реагировать по-разному в зависимости от того, кто клиент? Я имею в виду, как можно создать что-то очень полезное, если нет логики, основанной на запросе клиента и т. д.?

Я предполагаю только, что будет два сервера:

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 мы должны делать это именно так?

Я также думаю, что для избежания состояния гонки, возможно, придется каким-то образом поместить две вышеуказанные команды в один конвейер.

Связанный контент