凤凰频道:向特定客户发送推送

alm*_*man 4 elixir phoenix-framework

嗨,我正在尝试使用elixir phoenix重新实现whatsapp功能.我在解决以下问题时遇到了问题:如果聊天室中的所有人都收到了该消息,我想发送消息状态为"已收到"的所有者,以便他可以显示双勾号.但是你如何向一个特定的客户广播?

sim*_*imo 6

您可以通过每个用户的主题来解决这个问题,这可以通过模式匹配轻松实现,同时注意安全验证:

def join("users:" <> user_id, _params, socket) do
    {user_id, _} = Integer.parse(user_id)

    %{id: id} = socket.assigns[:user]

    #prevent connection to solo channel of other users, but allow in development
    case id == user_id || Mix.env == :dev do
      true ->
        {:ok, socket}
      false ->
        {:error, "This is not your solo channel!"}
      end
  end
Run Code Online (Sandbox Code Playgroud)

正如您Repo.get在用户连接到套接字时存储用户一样:

defmodule MyApp.UserSocket do
  use Phoenix.Socket

  def connect(%{"token" => token}, socket) do
    case Phoenix.Token.verify(socket, "user", token, max_age: 1209600) do
      {:ok, user_id} ->
        socket = assign(socket, :user, Repo.get!(User, user_id))
        {:ok, socket}
      {:error, _} -> #...
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

最后,您可以在套接字上下文中向特定用户发送消息,如下所示:

YourAll.Endpoint.broadcast user_topic, "message", %{details: "etc"}
Run Code Online (Sandbox Code Playgroud)

为了测试性能,这是一个非常翔实的会话,其中Gary Rennie展示了如何使用Tsung工具对WebSockets进行基准测试.