3

ソケット通信に yaws (Erlang フレームワーク) を使用しています。websocket_sendを使用してサーバーからユーザーにメッセージを送信できますが、ユーザーの PID を指定する必要があります。つまり、そのユーザーにメッセージを送信できます。ただし、接続しているすべてのユーザーにメッセージを送信したいと思います。それを行う方法はありますか?

4

3 に答える 3

2

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}.
于 2013-03-29T15:31:48.587 に答える
1

うまくいきました!!! 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
于 2013-04-08T01:57:02.060 に答える
0

これには、メモリ内ストレージを含む包括的なアプローチが必要になります。たとえば、各ユーザーはソケット接続を保持しているプロセスを持っている可能性があるため、次のようなレコードを保存しmnesiaます。この問題について理解を深めた後で、セッション管理、オフライン メッセージの処理方法、そして最も重要な. いずれにせよ、送信先のユーザー名を持つメッセージが着信すると、テーブルからルックアップを作成して対応する を取得し、このメッセージを送信します。次に、このメッセージがライブ Web ソケットを介して送信されます。ets table#connected_user{pid = Pid,username = Username,other_params = []}

presencePid

于 2013-03-29T09:32:13.990 に答える