Haskell 通过反射dom中的WebSocket检测关闭的服务器连接?

Haskell 通过反射dom中的WebSocket检测关闭的服务器连接?,haskell,reflex,Haskell,Reflex,我一直在使用Reflect和Reflect dom来重新创建一个网络版的棋盘游戏,到目前为止我非常喜欢它,但我需要一个websocket来在其他玩家移动时提醒玩家 一切都很好,但如果服务器宕机,我无法找到一种方法来检测它是否发生并重新连接。此外,如果您在服务器关闭时向服务器发送事件,那么它将被完全吃掉,不会出现任何错误 我使用的是来自的websockets示例的精简版本 {-#语言递归DO} 模块库在哪里 导入数据.幺半群 导入反射.Dom 导入符合条件的数据。文本为T 导入Data.Text.

我一直在使用Reflect和Reflect dom来重新创建一个网络版的棋盘游戏,到目前为止我非常喜欢它,但我需要一个websocket来在其他玩家移动时提醒玩家

一切都很好,但如果服务器宕机,我无法找到一种方法来检测它是否发生并重新连接。此外,如果您在服务器关闭时向服务器发送事件,那么它将被完全吃掉,不会出现任何错误

我使用的是来自的websockets示例的精简版本

{-#语言递归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