Haskell IO 与 Websockets

3

以下是使用websockets库的方法

{-# LANGUAGE OverloadedStrings #-}

module Main where

import System.IO
import System.IO.Unsafe
import Network.Socket hiding (recv)
import Network.WebSockets
import Network.Socket.ByteString
import qualified Data.ByteString.Char8 as B
import Debug.Trace
import Control.Applicative

fetch :: IO B.ByteString
fetch = do
  B.putStrLn "connected"
  [v4] <- getAddrInfo Nothing (Just "127.0.0.1") (Just "3000")
  c <- socket (addrFamily  v4) Stream 0x6
  c `connect` (addrAddress v4)
  recv c 512000

proxy :: TextProtocol p => WebSockets p ()
proxy = sendTextData . unsafePerformIO $! fetch

app :: Request -> WebSockets Hybi00 ()
app r = acceptRequest r >> r `traceShow` proxy

main :: IO ()
main = withSocketsDo $! runServer "0.0.0.0" 4000 app

使用fetch只会发生一次,并且所有WebSocket客户端都接收到相同的非新鲜数据。

  • 如何使用websockets进行任意IO操作?
  • 如何使上面的示例与新鲜的fetch一起运行?

我很乐意听取任何建议或完整解决方案。不触及iteratee的解决方法将受到特别赞赏。


1
顺便提一下,它只发生一次的原因是因为您使用了 unsafePerformIO(真可耻! :))。 GHC 假设对纯函数的多个调用可以合并为对该函数的单个缓存调用。这是几乎总是不建议使用 unsafePerformIO 的众多原因之一。 - Gabriella Gonzalez
1个回答

3
WebSockets单子是MonadIO类型类的一个实例,因此您可以使用liftIO函数进行任意IO操作。

在这种情况下,我猜想您想要执行:

proxy = liftIO fetch >>= sendTextData

你还需要添加导入。
import Control.Monad.IO.Class

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接