代码之家  ›  专栏  ›  技术社区  ›  Thomas Browne

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

  •  0
  • Thomas Browne  · 技术社区  · 4 年前

    我看到了Elixir WebSockex库的基本示例 here 但它并没有真正解释我如何暴露自己的websocket 到互联网 . This question 有解释如何在外部与现有websocket聊天的答案,但我想公开我自己的websocket。我实际上正在使用websockex作为Phoenix应用程序的一部分,所以也许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频道,因为消费者不了解Phoenix频道。如果Phoenix可以公开一个原始websocket,那么我也会认为这是一个解决方案。

    如果Phoenix和WebSockex都无法提供帮助,我有什么选择?

    0 回复  |  直到 4 年前
        1
  •  2
  •   Paweł Obrok    4 年前

    Websockex 是一个客户端库,我认为它没有任何暴露websocket的代码。既然你已经在使用phoenix,你可能可以用它做你需要的事情 phoenix channels .

    如果你在 cowboy (很可能是这样,因为这是默认设置),那么您也可以使用它来公开一个原始websocket。然而,这需要对路由进行一些调整。您需要更换 YourAppWeb.Endpoint 手动配置 牛仔 :

    {
      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()}}
        ]
      ]
    }
    

    老实说,我只是用生 plug ,因此您可能需要将端点转换为 Plug 而不是a Phoenix.Endpoint 。然后,您需要实施 YourApp.WebsocketHandler 遵守 牛仔 的API,并执行websocket升级(并处理发送/接收消息),如所述 in cowboy docs 。您还可以看到 this gist 举一个更具体的例子。

        2
  •  2
  •   Aleksei Matiushkin    4 年前

    WebSockex 实现了许多回调,包括但不限于 WebSockex.handle_connect/2 。它成立了 WebSockex.Conn 并将其传递给所有回调。

    WebSockex。康 是一种普通的旧货 struct ,具有 socket 现场。

    因此,从任何回调(我从 WebSockex.handle_connect/2 )您可以将此套接字与需要它的进程共享,然后从那里使用它。


    此外,您可以借用一些内部构件并检查连接方式 is being created .

    你会看到它的用途 WebSockex.Conn.new/2 它返回一个初始化的连接,该连接又包含一个套接字。在这种情况下,您将不得不手动监督持有套接字的过程。


    OSS的强大之处在于,所有答案都离问题很远,只需点击鼠标即可。