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 クライアントは最新ではない同じデータを受け取ります。

  • で任意の IO を行うにはどうすればよいwebsocketsですか?
  • fetch上記の例を新しいesで動作させるにはどうすればよいですか?

提案や完全な解決策を聞きたいです。触れずにそれを行う方法はiteratee非常に高く評価されます.

4

1 に答える 1

3

WebSocketsモナドはMonadIO型クラスのインスタンスであるため、関数を使用して任意の IO 操作を行うことができますliftIO

この場合、私はあなたがやりたいと思っています

proxy = liftIO fetch >>= sendTextData

また、インポートを追加する必要があります

import Control.Monad.IO.Class
于 2012-07-20T17:46:04.593 に答える