簡體   English   中英

如何使用 WebSockex 公開我自己的 Elixir websocket

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM