我已经完成了Don Stewart's Roll your own IRC bot tutorial的工作,正在玩一些扩展程序。我现在的代码基本上与“monadic,有状态,异常处理机器人的所有荣耀”相同;除非有人要求,否则粘贴此处有点太长了。
作为康卡斯特的订阅者,在连接不良之后,僵尸程序能够重新连接尤为重要。我的方法是简单地计算来自服务器的PING
个请求,如果它在一段时间内没有看到PING
,则尝试重新连接。
到目前为止,我发现的最佳解决方案是使用hGetLine
将listen
包裹在System.Timeout.timeout
循环中。但是,这似乎需要定义自定义异常,以便catch
中的main
可以再次调用main
,而不是return ()
。为每个人hGetLine
指定超时值似乎也很脆弱。
是否有更好的解决方案,也许包含IO a
bracket
和catch
之类的内容,以便整个主服务器可以处理网络超时而不会产生新的异常类型的开销?< / p>
答案 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 ())
这个想法是通过定期重新连接到一个单独的线程来封装所有的困难。