带Websockets的Haskell IO

时间:2012-07-20 17:40:29

标签: haskell io websocket

以下列方式使用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 es?
  • 一起使用

我很想听到任何建议或完整的解决方案。如何在不触及iteratee的情况下进行此操作将非常受欢迎。

1 个答案:

答案 0 :(得分:3)

WebSockets monad是MonadIO类型类的实例,因此您可以使用liftIO函数执行任意IO操作。

在这种情况下,我猜你想要做

proxy = liftIO fetch >>= sendTextData

您还需要添加导入

import Control.Monad.IO.Class