客户端访问套接字可以分配吗?

时间:2018-12-25 22:06:23

标签: javascript websocket elixir phoenix-framework channel

我知道在Phoenix Channel中,服务器可以通过套接字分配来保持状态,例如

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

但是,我无法找出客户端是否有任何方式可以访问这些分配。

我的困惑是,如果应该在服务器和客户端之间保持套接字连接直到终止,那么客户端也不能访问该连接中的内容吗?

还是所有这些分配仅保留在服务器端进程中,因此即使客户端在某些情况下仍保持与服务器的连接,客户端也无法访问这些分配方式吗?

如果是这种情况,服务器似乎必须向客户端明确广播它存储的所有分配内容,如果愿意的话?

1 个答案:

答案 0 :(得分:3)

  

我的困惑是,如果应该保持套接字连接   在服务器和客户端之间终止,直到终止为止。   客户端还能访问此连接中的内容吗?

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

该结构不在连接中。而是该结构是服务器用于存储有关特定连接的相关信息的暂存器。根据{{​​3}}:

  

要开始通信,客户端必须连接到节点(Phoenix服务器)   使用传输工具(例如Websocket或长时间轮询)并加入一个或   使用单个网络连接的更多频道。一通道服务器   每个客户,每个主题创建流程。 适当的套接字   处理程序为频道服务器初始化%Phoenix.Socket (可能   在对客户端进行身份验证之后)。然后,频道服务器会保留   %Phoenix.Socket {},并可以在其内部维护所需的任何状态   套接字分配。

     

建立连接后,每个来自   客户端根据其主题路由到正确的通道服务器。   如果频道服务器要求广播消息,则该消息为   发送到本地PubSub,然后将其发送到连接的所有客户端   到同一服务器并订阅了该主题。

-

  

服务器似乎必须向客户端明确广播任何内容   分配它是否已存储?

是的

您可以在此Channels docs(从4:15开始)中查看服务器如何使用分配。