[英]How does an Elixir/Phoenix app know its own websocket uri?
[英]How do I expose my own Elixir websocket using WebSockex
我在這里看到了 Elixir 的 WebSockex 庫的基本示例,但它並沒有真正解釋我如何將自己的 websocket 公開到互聯網上。 這個問題的答案解釋了如何在外部與現有的 websocket 聊天,但我想公開我自己的 websocket。 我實際上是在使用 websockex 作為 Phoenix 應用程序的一部分,所以 Phoenix 的一些可能在這里有所幫助?
我顯然知道我的鳳凰應用程序的 ip:port 組合,所以鑒於這些,我如何在 ip:port 上公開 websockex websocket? 換句話說,我應該傳遞什么作為 URL? 在這個基本示例代碼中:
defmodule WebSocketExample do
use WebSockex
def start_link(url, state) do
WebSockex.start_link(url, __MODULE__, state)
end
def handle_frame({type, msg}, state) do
IO.puts "Received Message - Type: #{inspect type} -- Message: #{inspect msg}"
{:ok, state}
end
def handle_cast({:send, {type, msg} = frame}, state) do
IO.puts "Sending #{type} frame with payload: #{msg}"
{:reply, frame, state}
end
end
請注意,我需要公開原始 websocket,而不是鳳凰頻道,因為消費者不了解鳳凰頻道。 如果 Phoenix 可以公開原始 websocket,那么我也會考慮這是一個解決方案。
如果 Phoenix 和 WebSockex 都無法提供幫助,我有什么選擇?
Websockex
是一個客戶端庫,我認為它沒有任何代碼可以公開 websocket。 由於您已經在使用 phoenix,您可能可以使用phoenix channels做您需要的事情。
如果你是cowboy
(你可能是,因為它是默認設置),那么你也可以使用它來公開原始 websocket。 但是,它需要一些擺弄路由。 您需要將YourAppWeb.Endpoint
替換為手動配置的cowboy
:
{
Plug.Cowboy,
scheme: :http,
plug: YourAppWeb.Endpoint,
options: endpoint_options(),
dispatch: [
_: [
# Dispatch paths beginning with /ws to a websocket handler
{"/ws/[...]", YourApp.WebsocketHandler, []},
# Dispatch other paths to the phoenix endpoint
{:_, Plug.Cowboy.Handler, {YourAppWeb.Endpoint, endpoint_options()}}
]
]
}
老實說,我只使用 raw plug
完成此操作,因此您可能需要將端點轉換為Plug
而不是Phoenix.Endpoint
。 然后,您需要實現YourApp.WebsocketHandler
以符合cowboy
的 API 並執行 websocket 升級(並處理發送/接收消息),如牛仔文檔中所述。 您還可以查看此要點以獲得更充實的示例。
WebSockex
實現了許多回調,包括但不限於WebSockex.handle_connect/2
。 它將WebSockex.Conn
保存在 state 中,並將其傳遞給所有回調。
WebSockex.Conn
是一個普通的舊的好結構,具有socket
字段。
因此,從任何回調(我會從WebSockex.handle_connect/2
執行此操作)中,您可以與需要它的進程共享此套接字,然后從那里使用它。
此外,您可以借用一些內部結構並檢查連接是如何創建的。
您會看到它使用WebSockex.Conn.new/2
返回一個初始化的連接,而該連接又持有一個套接字。 在這種情況下,您將不得不手動監督持有套接字的進程。
OSS 的強大之處在於所有的答案都是一鍵點擊,遠離問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.