我一直在使用反射和反射-DOM重新建立一个棋盘游戏的网络版本,我很喜欢它,到目前为止,但我需要的WebSocket当其他球员了一招,以提醒玩家。通过reflex-dom中的websockets检测关闭的服务器连接?
一切都很正常,但是,如果服务器出现故障,我不能找到一种方法来检测,它发生和重新连接。此外,如果您在发生事件时向服务器发送事件,它只会被吃掉而没有任何错误。
我使用的WebSockets示例的精简版从https://github.com/reflex-frp/reflex-examples/blob/master/websocket-echo/src/Main.hs
{-# LANGUAGE RecursiveDo #-}
module Lib where
import Data.Monoid
import Reflex.Dom
import qualified Data.Text as T
import Data.Text.Encoding (encodeUtf8, decodeUtf8)
wsurl = "ws://127.0.0.1:5714"
-- wsurl = "ws://echo.websocket.org"
someFunc = mainWidget $ do
rec t <- textInput $ def & setValue .~ fmap (const "") newMessage
b <- button "Send"
text $ "Sending to " <> wsurl
let newMessage = fmap ((:[]) . encodeUtf8 . T.pack) $ tag (current $ value t) $ leftmost [b, textInputGetEnter t]
ws <- webSocket wsurl $ def & webSocketConfig_send .~ newMessage
receivedMessages <- foldDyn (\m ms -> ms ++ [m]) [] $ _webSocket_recv ws
el "p" $ text "Responses from :"
_ <- el "ul" $ simpleList receivedMessages $ \m -> el "li" $ dynText =<< mapDyn (T.unpack . decodeUtf8) m
return()
我觉得应该有一个办法做到这一点与tickLossy与超时发送坪,像一些动态返回的WebSockets然后在ping没有响应的情况下重新连接一段时间?但是我很难想象重新连接代码的样子。
编辑:这是与反射-DOM发送事件同时的WebSocket仍处于待定状态的问题。我提出了拉取请求,但我觉得在某个地方有更好的解决方案。
我看到这个代码,但它并没有重新给我。事实证明,如果你而插座服务器关闭发送邮件,它会导致一个异常被抛出客户端,然后即使服务器回来,它不会继续执行。所以它肯定是图书馆的一个问题。 –