我知道在Phoenix Channel中,服务器可以通过套接字分配来保持状态,例如
def join("room:lobby", payload, socket) do
socket = socket
|> assign(:message, Enum.random(@messages))
|> assign(:albums, [])
{:ok, socket}
end
但是,我无法找出客户端是否有任何方式可以访问这些分配。
我的困惑是,如果应该在服务器和客户端之间保持套接字连接直到终止,那么客户端也不能访问该连接中的内容吗?
还是所有这些分配仅保留在服务器端进程中,因此即使客户端在某些情况下仍保持与服务器的连接,客户端也无法访问这些分配方式吗?
如果是这种情况,服务器似乎必须向客户端明确广播它存储的所有分配内容,如果愿意的话?
答案 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开始)中查看服务器如何使用分配。