ソケット通信に yaws (Erlang フレームワーク) を使用しています。websocket_sendを使用してサーバーからユーザーにメッセージを送信できますが、ユーザーの PID を指定する必要があります。つまり、そのユーザーにメッセージを送信できます。ただし、接続しているすべてのユーザーにメッセージを送信したいと思います。それを行う方法はありますか?
3 に答える
Websocket 接続が確立されるたびに、その接続用に新しい gen_server プロセスが作成されます。したがって、これらのサーバーはそれぞれ 1 つの WebSocket 接続に対応します。したがって、websocket_send には gen_server の PID が必要です。
接続されているすべてのクライアントにメッセージを送信するには、すべての gen_servers の PID を維持する必要があります。これは、独自の gen_server を持つか、ets を使用して行うことができます。
Pid を gen_serverに送信するのと同様に 、websocket コールバック init 関数で Pid を送信できます。
init(Args) ->
gen_server:cast(?YOURSERVER,{connection_open, self()}),
{ok, []}.
終了時
terminate(Reason, State) ->
gen_server:cast(?YOURSERVER,{connection_close, self()}).
gen_server handle_cast は次のようになります
handle_cast({connection_open, Pid}, Pids) ->
{noreply, [Pid | Pids]};
handle_cast({connection_close, Pid}, Pids) ->
{noreply, lists:delete(Pid, Pids)};
handle_cast({send_to_all, Msg}, Pids) ->
[yaws_api:websocket_send(Pid, Msg) || Pid <- Pids, is_process_alive(Pid)],
{noreply, Pids}.
うまくいきました!!! GProcの使用:)
gproc は Erlang のプロセス ディクショナリであり、組み込みのディクショナリにはない多くの便利な機能を提供します。
Use any term as a process alias
Register a process under several aliases
Non-unique properties can be registered simultaneously by many processes
QLC and match specification interface for efficient queries on the dictionary
Await registration, let's you wait until a process registers itself
Atomically give away registered names and properties to another process
Counters, and aggregated counters, which automatically maintain the total of all counters with a given name
Global registry, with all the above functions applied to a network of nodes
これには、メモリ内ストレージを含む包括的なアプローチが必要になります。たとえば、各ユーザーはソケット接続を保持しているプロセスを持っている可能性があるため、次のようなレコードを保存しmnesia
ます。この問題について理解を深めた後で、セッション管理、オフライン メッセージの処理方法、そして最も重要な. いずれにせよ、送信先のユーザー名を持つメッセージが着信すると、テーブルからルックアップを作成して対応する を取得し、このメッセージを送信します。次に、このメッセージがライブ Web ソケットを介して送信されます。ets table
#connected_user{pid = Pid,username = Username,other_params = []}
presence
Pid