haskell - 重新连接网络套接字 [Haskell]
问题描述
我正在使用wuss
库(一个包装器websockets
)来创建一个 websocket 连接。如果网络套接字由于某种原因断开连接,将如何创建循环来重新连接?
ws :: ClientApp ()
ws connection = do
putStrLn "Connected!"
sendTextData connection msgSubscribe -- defined elsewhere
let loop = do
message <- receiveData connection
print (message)
loop
loop
sendClose connection (pack "Bye!")
main :: IO ()
main = runSecureClient "ws.kraken.com" 443 "/" ws -- retry at this point?
解决方案
如何“重试”取决于协议。如果你真的只是想在连接失败时从头开始重试,你可以这样做
{-# LANGUAGE ScopedTypeVariables #-}
import Control.Exception (catch)
-- ...
-- the rest of your code
-- ...
retryOnFailure ws = runSecureClient "ws.kraken.com" 443 "/" ws
`catch` (\e ->
if e == ConnectionClosed
then retryOnFailure ws
else return ())
但请注意,这是一个“愚蠢的”重试,因为如果远程连接意外关闭(预期的关闭将导致程序结束),它实际上只是从头开始。如果你想保持任何一种状态或类似的东西,你必须弄清楚如何为你遵循的任何协议做到这一点,但如果你只是通过一些不稳定的连接监听数据,这应该足够了。
推荐阅读
- jestjs - 使用 test.each 断言失败的笑话日志消息
- powerbi - 使用 Power BI (DirectQuery) 计算每日收入和预算之间的差异
- azure-data-explorer - Azure 数据资源管理器 (Kusto) 覆盖 creationTime
- javascript - 服务器端 VS 数据传输中的自动完成
- xml - 使用 refcursor 作为参数类型时的 SOA Gateway xml 输出
- arrays - 用数组填充列表框
- c# - Asp.Net core 2.1 await 在第二次运行时不会让调用者控制
- html - Angular 5 它总是用当前日期覆盖选定的日期
- ruby-on-rails - Gem 未加载:NameError(未初始化的常量)| 但是 gem 在本地路径中工作
- ios - 如何从目标 c 中的相机胶卷中导出慢动作视频(240 fps)?