以下是使用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
的解决方法将受到特别赞赏。
unsafePerformIO
(真可耻! :))。 GHC 假设对纯函数的多个调用可以合并为对该函数的单个缓存调用。这是几乎总是不建议使用unsafePerformIO
的众多原因之一。 - Gabriella Gonzalez