如何解决如何使用 WebSockex
我看到 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 都无法提供帮助,我有什么选择?
解决方法
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()}}
]
]
}
老实说,我只使用原始 plug
完成此操作,因此您可能需要将端点转换为 Plug
而不是 Phoenix.Endpoint
。然后,您需要实现 YourApp.WebsocketHandler
以符合 cowboy
的 API 并执行 websocket 升级(并处理发送/接收消息),如 in cowboy docs 所述。您还可以查看 this gist 以获得更充实的示例。
WebSockex
实现了许多回调,包括但不限于 WebSockex.handle_connect/2
。它将 WebSockex.Conn
保持在一个状态并将其传递给所有回调。
WebSockex.Conn
是一个普通的旧商品 struct,具有 socket
字段。
因此,从任何回调(我会从 WebSockex.handle_connect/2
执行),您可能会与需要它的进程共享此套接字,然后从那里使用它。
另外,你可以借用一些内部结构并检查连接is being created。
您会看到它使用 WebSockex.Conn.new/2
返回一个已初始化的连接,而该连接又包含一个套接字。在这种情况下,您将不得不手动监督持有套接字的进程。
OSS 的强大之处在于,所有答案都在远离问题的地方一键点击。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。