Haskell 通过反射dom中的WebSocket检测关闭的服务器连接?
我一直在使用Reflect和Reflect dom来重新创建一个网络版的棋盘游戏,到目前为止我非常喜欢它,但我需要一个websocket来在其他玩家移动时提醒玩家 一切都很好,但如果服务器宕机,我无法找到一种方法来检测它是否发生并重新连接。此外,如果您在服务器关闭时向服务器发送事件,那么它将被完全吃掉,不会出现任何错误 我使用的是来自的websockets示例的精简版本Haskell 通过反射dom中的WebSocket检测关闭的服务器连接?,haskell,reflex,Haskell,Reflex,我一直在使用Reflect和Reflect dom来重新创建一个网络版的棋盘游戏,到目前为止我非常喜欢它,但我需要一个websocket来在其他玩家移动时提醒玩家 一切都很好,但如果服务器宕机,我无法找到一种方法来检测它是否发生并重新连接。此外,如果您在服务器关闭时向服务器发送事件,那么它将被完全吃掉,不会出现任何错误 我使用的是来自的websockets示例的精简版本 {-#语言递归DO} 模块库在哪里 导入数据.幺半群 导入反射.Dom 导入符合条件的数据。文本为T 导入Data.Text.
{-#语言递归DO}
模块库在哪里
导入数据.幺半群
导入反射.Dom
导入符合条件的数据。文本为T
导入Data.Text.Encoding(encodeUtf8,decodeUtf8)
wsurl=“ws://127.0.0.1:5714”
--wsurl=“ws://echo.websocket.org”
someFunc=mainWidget$do
rec t当websocket关闭时,该库将尝试:
您可能应该在他们的问题跟踪器上打开一个问题。或者只是找到更好的图书馆
编辑:反射dom在发送事件时出现问题
websocket仍处于挂起状态。我提出了一个请求,
虽然我觉得有更好的解决办法
仅供参考,自问题发布以来,WebSocket API的一些相关扩展已合并到反射dom中:
- 您可以通过
Event
s关闭WebSocket,请参阅
- 您可以指定是否要自动重新连接,请参阅
- 连接关闭时会出现一个
事件
,请参阅
- 当发生错误时,会暴露一个
事件
,请参阅
我相信这场比赛正是你想要的。当时它只是不可用。我在代码中看到了这一点,但它没有为我重新连接。事实证明,如果在套接字服务器关闭时发送消息,会导致客户端抛出异常,即使服务器返回,也不会继续执行。所以这绝对是图书馆的问题。
{-# 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 ()
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 ()
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