我已经通过Don Stewart的滚动你自己的IRC机器人教程,我正在玩它的一些扩展.我现在的代码基本上与"monadic,有状态,异常处理机器人的所有荣耀"相同; 除非有人要求,否则粘贴在这里有点太长了.
作为康卡斯特的用户,特别重要的是机器人能够在连接不良之后重新连接.我的方法是简单地计算PING来自服务器的请求,如果它没有看到一段PING时间,则尝试重新连接.
到目前为止,我发现的最佳解决方案是hGetLine将listen循环包裹起来System.Timeout.timeout.但是,这似乎需要定义一个自定义异常,以便catchin main可以main再次调用,而不是return ().为每个人指定超时值似乎也很脆弱hGetLine.
有没有更好的解决办法,或许还有一个包装了IO a像bracket,并catch让整个主可以处理网络超时,无新的异常类型的开销?
运行一个单独的线程来执行所有读取和写入并负责定期重新连接句柄怎么样?
像这样的东西
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 ())
Run Code Online (Sandbox Code Playgroud)
这个想法是将定期重新连接的所有困难封装到一个单独的线程中。