0

ドキュメントにはこの例がありますが、切断された場合にのみ機能します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その方法がわかりません。

4

1 に答える 1

1

ブロードキャストを受信するには、実際にトピックをサブスクライブする必要があります。

「切断」メッセージは、サブスクリプションを必要としないため、特別です。

Phoenix.Socketソース コード内には、次の 3 行があります。

  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
于 2021-04-15T03:51:36.403 に答える