以惯用方式自动重新连接Haskell网络连接

时间:2011-04-12 00:48:29

标签: haskell

我已经完成了Don Stewart's Roll your own IRC bot tutorial的工作,正在玩一些扩展程序。我现在的代码基本上与“monadic,有状态,异常处理机器人的所有荣耀”相同;除非有人要求,否则粘贴此处有点太长了。

作为康卡斯特的订阅者,在连接不良之后,僵尸程序能够重新连接尤为重要。我的方法是简单地计算来自服务器的PING个请求,如果它在一段时间内没有看到PING,则尝试重新连接。

到目前为止,我发现的最佳解决方案是使用hGetLinelisten包裹在System.Timeout.timeout循环中。但是,这似乎需要定义自定义异常,以便catch中的main可以再次调用main,而不是return ()。为每个人hGetLine指定超时值似乎也很脆弱。

是否有更好的解决方案,也许包含IO a bracketcatch之类的内容,以便整个主服务器可以处理网络超时而不会产生新的异常类型的开销?< / p>

1 个答案:

答案 0 :(得分:1)

如何运行一个执行所有读写操作的单独线程,并负责定期重新连接句柄?

像这样的东西

 input  :: Chan Char
 output :: Chan Char

 putChar c = writeChan output c

 keepAlive = forever $ do
     h <- connectToServer
     catch
         (forever $
              do c <- readChan output; timeout 4000 (hPutChar h c); return ())
         (\_ -> return ())

这个想法是通过定期重新连接到一个单独的线程来封装所有的困难。