4
您好我正在尝试使用仙丹凤凰重新实现whatsapp功能。我在解决以下问题时遇到了问题:如果聊天室中的所有人都收到了消息,我想发送消息状态“received”的所有者,以便他可以显示双刻度符号。但是,你如何向一个特定的客户进行广播?菲尼克斯频道:发送推送到一个特定的客户端
您好我正在尝试使用仙丹凤凰重新实现whatsapp功能。我在解决以下问题时遇到了问题:如果聊天室中的所有人都收到了消息,我想发送消息状态“received”的所有者,以便他可以显示双刻度符号。但是,你如何向一个特定的客户进行广播?菲尼克斯频道:发送推送到一个特定的客户端
您可以通过每个用户的话题解决这个问题,这可以很容易地通过模式匹配来实现,注意安全验证也:
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"}
为了测试性能,这是一个very informative session,其中Gary Rennie展示了如何使用Tsung工具对WebSockets进行基准测试。
检查此问题:http://stackoverflow.com/questions/37373766/phoenix-return-ecto-query-results-to-a-specific-client/37375057#37375057 – simo
@simo问题是一个有点关闭,因为客户端A发送消息并接收消息。我需要的是:客户端A发送消息,并且只有客户端B收到一些反馈 – Nomad
我认为仅为客户端B分配一个主题是一个好主意,然后您可以向该主题进行广播,否则我不知道如何排除特定用户,看看这里:http://stackoverflow.com/questions/37279779/how-to-exclude-some-users-when-broadcast – simo