如何解决如何使用 phoenix 广播到一个 socket_id
在文档中有这个例子,但它只适用于断开连接 https://hexdocs.pm/phoenix/Phoenix.Socket.html#module-examples
use Phoenix.socket
channel "room:*",MyAppWeb.RoomChannel
def connect(params,socket,_connect_info) do
{:ok,assign(socket,:user_id,params["user_id"])}
end
def id(socket),do: "users_socket:#{socket.assigns.user_id}"
end
# disconnect all user's socket connections and their multiplexed channels
MyAppWeb.Endpoint.broadcast("users_socket:" <> user.id,"disconnect",%{})
我试过了,它只适用于断开连接。
我在某些地方读到过,您可以为该用户创建特定主题,但我可以使用一个实际示例。我无法理解复杂性,可以使用一个实际示例。
谢谢。
我在想,如果你能在 ets 表中获得底层套接字,你就可以 push/4
到那个套接字,但我不知道该怎么做。
解决方法
您需要实际订阅主题才能接收广播。
“断开连接”消息很特别,因为它不需要订阅。
在 Phoenix.Socket
源代码中,存在以下三行:
def __info__(%Broadcast{event: "disconnect"},state) do
{:stop,{:shutdown,:disconnected},state}
end
它们是接收“断开连接”广播时套接字状态发生变化的原因。
“回退”函数如下所示:
def __info__(_,state) do
{:ok,state}
end
这意味着对于任何和所有“其他”主题,套接字状态保持不变。
您需要手动订阅“其他”主题。
它应该看起来像这样:
socket.endpoint.subscribe("some_topic:" <> socket.assigns.user_id)
然后你可以像这样广播消息:
MyAppWeb.Endpoint.broadcast("some_topic:" <> user.id,"some_event",%{foo: bar})
如果您使用 LiveView 执行此操作,那么最简单的入门方法是将其放入您的挂载函数中:
if connected?(socket) do
socket.endpoint.subscribe("some_topic:" <> socket.assigns.user_id)
end
然后有一个像这样的handle_info
:
@impl true
def handle_info(%{event: "some_event"} = info,socket) do
IO.inspect info,label: "INFO"
{:noreply,socket}
end
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。