Может ли клиентский сокет доступа назначать? - PullRequest
0 голосов
/ 26 декабря 2018

Я знаю, что в Phoenix Channel сервер может сохранять состояния с помощью назначений сокетов, например,

def join("room:lobby", payload, socket) do
  socket = socket
    |> assign(:message, Enum.random(@messages))
    |> assign(:albums, [])
  {:ok, socket}
end

Однако я не смог выяснить, есть ли у клиента какой-либо способ доступа к этим назначениям..

Моя путаница заключается в том, что, если якобы соединение между сервером и клиентом сохраняется, пока оно не будет разорвано, разве клиент не сможет получить доступ к тому, что находится в этом соединении?

Или это тот случай, когда все эти назначения хранятся только в серверном процессе и, следовательно, недоступны для клиента, даже если клиент каким-то образом поддерживает соединение с сервером?

Если это так, кажется, что сервер должен явно передать клиенту все присвоенные ему значения, если он этого хочет?

1 Ответ

0 голосов
/ 26 декабря 2018

Моя путаница заключается в том, что, если соединение между сервером и клиентом предположительно поддерживается сокетом, пока оно не будет разорвано, не должен ли клиент иметь доступ к тому, что находится в этом соединении?

assigns - это просто ключ в структуре:

defmodule Phoenix.Socket
  ...
  ...
  defstruct assigns: %{},
            channel: nil,
            channel_pid: nil,
            endpoint: nil,
            handler: nil,
            id: nil,
            joined: false,
            join_ref: nil,
            private: %{},
            pubsub_server: nil,
            ref: nil,
            serializer: nil,
            topic: nil,
            transport: nil,
            transport_pid: nil

https://github.com/phoenixframework/phoenix/blob/v1.4.0/lib/phoenix/socket.ex#L181

Эта структура НЕ находится в соединении.Скорее структура представляет собой блокнот, который сервер использует для хранения соответствующей информации о конкретном соединении.В соответствии с документами Channels :

Чтобы начать общение, клиент подключается к узлу (серверу Phoenix), используя транспорт (например, веб-сокеты или длинный опрос), и присоединяется к одному из них.или более каналов, использующих это единственное сетевое соединение.Один серверный процесс канала создается для каждого клиента в каждой теме. Соответствующий обработчик сокетов инициализирует% Phoenix.Socket для канального сервера (возможно, после аутентификации клиента).Канальный сервер затем удерживает% Phoenix.Socket {} и может поддерживать любое состояние, которое ему необходимо в пределах его socket.assigns.

Как только соединение установлено, каждое входящее сообщение от клиента маршрутизируется на основе еготема, на правильный сервер канала.Если сервер канала запрашивает широковещательную рассылку, это сообщение отправляется в локальный PubSub, который отправляет его всем клиентам, подключенным к тому же серверу и подписанным на эту тему.

-

Похоже, что сервер должен явно передавать клиенту все присвоенные ему данные, если он хочет?

Да.

Вы можете проверить, каксервер может использовать назначения в этом ElixirCasts.io видео (начиная с 4:15).

...