Yaws websocket向所有连接的用户发送消息



我使用雅司(Erlang框架)套接字通信。我可以使用websocket_send从服务器向用户发送消息,但是我需要指定用户的PID,这意味着我可以将消息发送回该用户。但是,我想发送消息给所有连接的用户。有什么办法吗?

每次建立websocket连接时,都会为该连接创建一个新的gen_server进程。因此,每个服务器对应一个websocket连接。因此websocket_send需要gen_server的PID。

为了向所有连接的客户端发送消息,您需要维护所有gen_server的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

这将需要一个涉及内存存储的综合方法。例如,每个用户可能有一个持有套接字连接的进程,因此,您可以在mnesiaets table等中保存一条记录,例如:#connected_user{pid = Pid,username = Username,other_params = []} .

稍后,在提高您对这个问题的认识之后,您将转移到会话管理,如何处理脱机消息,以及最重要的presence。无论如何,当消息传入时,具有目的地用户名,然后您将从我们的表中进行查找并获得相应的Pid,然后将此消息发送给它,然后,它将通过其实时Web Socket发送它。

相关内容

  • 没有找到相关文章

最新更新