2016-03-04 57 views
4

我一直在使用反射和反射-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仍处于待定状态的问题。我提出了拉取请求,但我觉得在某个地方有更好的解决方案。

回答

1

编辑:这是一个反射dom发送事件,而一个 websocket仍处于挂起状态的问题。我做了一个拉请求, 虽然我觉得有一个更好的解决方案的地方。

仅供参考,因为这个问题被张贴到网页套接字API合并成反射-DOM出现了一些颇为相关的扩展:

我相信close事件正是你所期待的。这在当时是不可用的。

1

它看起来像时的WebSocket关闭时,库尝试reconnect

start = do 
    ws <- liftIO $ newWebSocket wv url onMessage onOpen $ do 
     void $ forkIO $ do --TODO: Is the fork necessary, or do event handlers run in their own threads automatically? 
     liftIO $ writeIORef currentSocketRef Nothing 
     liftIO $ threadDelay 1000000 
     start 
    liftIO $ writeIORef currentSocketRef $ Just ws 
    return() 

(在最后一个参数newWebSockettakesonClose事件处理程序)

而且在重新连接您发送的所有邮件是ignored

performEvent_ $ ffor (_webSocketConfig_send config) $ \payloads -> forM_ payloads $ \payload -> do 
    mws <- liftIO $ readIORef currentSocketRef 
    case mws of 
     Nothing -> return() -- Discard --TODO: should we do something better here? probably buffer it, since we handle reconnection logic; how do we verify that the server has received things? 
     Just ws -> do 
     liftIO $ webSocketSend ws payload 

你或许应该打开他们的问题跟踪器的问题。或者只找到更好的图书馆。

+0

我看到这个代码,但它并没有重新给我。事实证明,如果你而插座服务器关闭发送邮件,它会导致一个异常被抛出客户端,然后即使服务器回来,它不会继续执行。所以它肯定是图书馆的一个问题。 –