如何使用 WebSockex

如何解决如何使用 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?