如何使用phoenix向一个socket_id广播



在文档中有这个例子,但它只适用于断开连接https://hexdocs.pm/phoenix/Phoenix.Socket.html#module-示例

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

然后有一个像这样的CCD_ 3:

@impl true
def handle_info(%{event: "some_event"} = info, socket) do
IO.inspect info, label: "INFO"
{:noreply, socket}
end

相关内容

  • 没有找到相关文章

最新更新