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

如何使用WebSockex公开自己的Elixir websocket,websocket,elixir,phoenix-framework,phoenix-channels,websockex,Websocket,Elixir,Phoenix Framework,Phoenix Channels,Websockex,我看到了Elixir的websocket库的基本示例,但它并没有真正解释如何将自己的websocket公开到internet上。有解释如何在外部与现有websocket聊天的答案,但我想公开我自己的websocket。实际上,我正在使用websockex作为Phoenix应用程序的一部分,所以Phoenix的一些内容可能会有所帮助 很明显,我知道我的phoenix应用程序的ip:port组合,因此考虑到这些,我如何在该ip:port上公开websockex websocket?换句话说,我应该传

我看到了Elixir的websocket库的基本示例,但它并没有真正解释如何将自己的websocket公开到internet上。有解释如何在外部与现有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频道。如果菲尼克斯可以公开原始WebSoCo,那么我也会考虑这个解决方案。


如果Phoenix和WebSockex都帮不上忙,我的选择是什么?

WebSockex
是一个客户端库,我认为它没有任何公开websocket的代码。由于您已经在使用phoenix,您可能可以使用它做您需要的事情

如果您使用的是
cowboy
(而且可能是,因为这是默认设置),那么您还可以使用它公开原始websocket。然而,它需要对路由进行一些调整。您需要用手动配置的
cowboy
替换
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()}}
    ]
  ]
}

老实说,我只使用原始
插件
,因此您可能需要将端点转换为
插件
,而不是
凤凰城.endpoint
。然后,您需要实现
YourApp.WebsocketHandler
,以符合
cowboy
的API并执行websocket升级(并处理发送/接收消息),如前所述。您还可以看到一个更加充实的示例。

Websockex
是一个客户端库,我认为它没有任何公开websocket的代码。由于您已经在使用phoenix,您可能可以使用它做您需要的事情

如果您使用的是
cowboy
(而且可能是,因为这是默认设置),那么您还可以使用它公开原始websocket。然而,它需要对路由进行一些调整。您需要用手动配置的
cowboy
替换
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()}}
    ]
  ]
}

老实说,我只使用原始
插件
,因此您可能需要将端点转换为
插件
,而不是
凤凰城.endpoint
。然后,您需要实现
YourApp.WebsocketHandler
,以符合
cowboy
的API并执行websocket升级(并处理发送/接收消息),如前所述。您还可以看到一个更加充实的示例。

WebSockex
实现了许多回调,包括但不限于。它保存在一个状态中,并将其传递给所有回调

WebSockex.Conn
是一种普通的老商品,有字段

因此,从任何回调(我会从
WebSockex.handle\u connect/2
执行)中,您可以与需要它的进程共享这个套接字,然后从那里使用它


此外,您还可以借用一些内部构件,检查连接是否正确

您将看到它使用返回初始化连接的函数,该函数依次保存套接字。在这种情况下,您必须监督手动固定插座的过程



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

WebSockex
实现了许多回调,包括但不限于。它保存在一个状态中,并将其传递给所有回调

WebSockex.Conn
是一种普通的老商品,有字段

因此,从任何回调(我会从
WebSockex.handle\u connect/2
执行)中,您可以与需要它的进程共享这个套接字,然后从那里使用它


此外,您还可以借用一些内部构件,检查连接是否正确

您将看到它使用返回初始化连接的函数,该函数依次保存套接字。在这种情况下,您必须监督手动固定插座的过程



OSS的强大之处在于,所有答案都是鼠标一键就能回答的。

我需要公开一个原始websocket,而不是phoenix频道,因为数据将被一个不了解phoenix频道的应用程序消耗。phoenix可以公开原始websocket吗?我添加了一些关于如何使用
cowboy
公开原始套接字的信息,尽管在我看来,这比自己实现phoenix协议的任何部分都要复杂,或者只需复制代码> DEPS/凤凰/资产/JS/凤凰。JS<代码>,如果你在一个非常低的技术解决方案-它只有1.6K线未被缩小。也考虑执行一个不同的协议。可能比添加手动
cowboy
配置更容易开始。我需要公开原始websocket而不是phoenix频道,因为数据将被不了解phoenix频道的应用程序使用。phoenix可以公开原始websocket吗?我添加了一些关于如何使用
cowboy
公开原始套接字的信息,尽管在我看来,这比自己实现phoenix协议的任何部分都要复杂,或者只需复制代码> DEPS/凤凰/资产/JS/凤凰。JS<代码>,如果你在一个非常低的技术解决方案-它只有1.6K线未被缩小。也考虑执行一个不同的协议。可能比添加手动
cowboy
配置更容易开始。好的,那么,您在这里解释的内容将允许我向internet公开websocket,对吗?因为这就是我需要的。使用者将是Javascript节点Red(),这说明了如何访问底层原始套接字。这就是被问到的问题。JS完全可以从Phoenix sockets读取,AFAIK.JS需要加载Phoenix库代码才能从Phoenix频道读取,而这在Node Red library a中是不可用的