如何确保 websocket 连接在 Aleph 中保持活动状态

How to ensure websocket connection is kept alive in Aleph

我正在尝试将 Slack 的 RTM API 与 Aleph 进行交互。

目前我有这个代码:

(defn connect-socket []
  (let [conn @(http/websocket-client (get-websocket-url))]
    (s/consume #(prn %) conn)
    (send-message conn {:type "ping"}) ;; just to check if send-message works
    (s/on-closed conn (prn "closed"))))

前几次运行良好,然后 conn 在不活动后停止接收来自 Slack 的消息。它也不打印 "closed",这似乎表示流未关闭。我不太确定这里发生了什么。

如何保持 websocket 连接,或者在断开连接时自动重新连接?我在野外看到过一些代码在执行 ping,但我认为我对代码的理解不够好,无法适应它。

我认为您必须发送 ping 消息,因为 :

  • websocket 断开连接由一个特殊的数据包发出信号
  • 在 ex 的情况下无法发送此数据包。网络错误
  • 没有 "auto reconnect" 功能,除非您使用可以为您完成此功能的库(我个人希望 sente 支持 Aleph)。

因此你必须定期做一些"pings"。 关于代码,on-closed 想要一个函数作为第二个参数,所以: (s/on-closed! conn #(prn "closed"))