Переподключите веб-сокет [Haskell] - PullRequest
0 голосов
/ 21 октября 2019

Я использую библиотеку wuss (обертка вокруг websockets) для создания соединения через веб-сокет. Как создать цикл для повторного подключения, если по какой-либо причине веб-сокет отключается?

ws :: ClientApp ()
ws connection = do
    putStrLn "Connected!"

    sendTextData connection msgSubscribe -- defined elsewhere

    let loop = do 
        message <- receiveData connection
        print (message)
        loop

    loop
    sendClose connection (pack "Bye!")

main :: IO ()
main = runSecureClient "ws.kraken.com" 443 "/" ws -- retry at this point?

1 Ответ

0 голосов
/ 21 октября 2019

Способ «повторной попытки» зависит от протокола. Если вы буквально хотите повторить попытку с самого начала, когда происходит сбой соединения, вы можете просто сделать

{-# LANGUAGE ScopedTypeVariables #-}
import Control.Exception (catch)

-- ...
-- the rest of your code
-- ...

retryOnFailure ws = runSecureClient "ws.kraken.com" 443 "/" ws
  `catch` (\e -> 
     if e == ConnectionClosed
     then retryOnFailure ws
     else return ())

, но учтите, что это «глупая» повторная попытка, поскольку она буквально начнется заново, еслиудаленное соединение неожиданно закрывается (ожидаемое закрытие приведет к завершению программы). Если вы хотите поддерживать какое-либо состояние или что-то в этом роде, вам придется выяснить, как это сделать для любого протокола, которым вы следуете, но этого должно быть достаточно, если вы просто слушаете данные через какое-то ненадежное соединение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...