您可以通过每个用户的主题来解决这个问题,这可以通过模式匹配轻松实现,还要注意安全验证:
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
正如您存储的用户一样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
最后,您可以在套接字上下文之外向特定用户发送消息,如下所示:
YourAll.Endpoint.broadcast user_topic, "message", %{details: "etc"}
为了测试性能,这是一个内容丰富的会议 http://www.archive.elixirconf.eu/elixirconf2016/gary-rennie其中 Gary Rennie 展示了如何使用 Tsung 工具对 WebSocket 进行基准测试。