终端IO无法在Warp / WAI应用程序中工作

时间:2017-09-06 19:21:55

标签: haskell websocket io warp

我搞乱了WebSockets,我写了一个" echo服务器"我希望在运行时记录到控制台:

echo = Warp.run 3000 app
  where
    app = WS.websocketsOr 
      WS.defaultConnectionOptions
      wsApp
      httpApp

    httpApp _ respond = do
      put "HTTP Request Recieved"
      respond $ Wai.responseFile 
        Http.status200
        []
        "web/index.html"
        Nothing

wsApp :: WS.ServerApp
wsApp pendingConn = do
  conn <- WS.acceptRequest pendingConn
  WS.forkPingThread conn 30
  put "WebSocket Connection Open"
  listen conn

listen :: WS.Connection -> IO ()
listen conn = forever $ do
  str <- WS.receiveData conn :: (IO Text.Text)
  put $ Text.unpack str
  WS.sendTextData conn str

main :: IO ()
main = do
  put "Echo WebSocket Running ..."
  echo

put str = hPutStrLn stdout str >> hFlush stdout

正如你所看到的,我已经尝试过冲stdout,但没有成功。我得到了

$ ./echoServer
Echo WebSocket Running ...

但仅此而已。即使我可以成功加载&#34; web / index.html&#34;在浏览器中成功建立与WebSocket的连接并使用它,我从控制台得不到反馈。

要将输出输出到控制台,我需要做什么?

图书馆版本:

1 个答案:

答案 0 :(得分:2)

以上代码实际上可行,但没有发生任何事情时都没有!这个问题是讨厌的缓存失效错误的结果,而不是我的代码中的错误。

我首先编写了客户端(强烈推荐使用Elm)并将websocket硬编码指向wss://echo.websocket.org,以便我可以测试前端。然后我得到后端为我提供了榆树创建的文件(但仍然指向wss://echo.websocket.org)。意识到我的错误,我将elm脚本更改为指向localhost并在后端添加了一些日志记录。如上所示。

然后我重新启动服务器并将浏览器指向localhost:3000。浏览器加载了缓存的副本(没有HTTP请求),仍然指向wss://echo.websocket.org(没有websocket请求)。

看起来前端正在工作,但后端没有记录。事实上,根本没有任何请求进入后端。

我今天晚上回来并开始搞乱我的代码,看看我是否可以让一切工作,第一次运行服务器一切(几乎)工作,但我没有做任何有效的改变,只是添加了一些新的'包括'线。缓存已过期。最重要的提示是除HTTP请求之外的所有内容都正确记录。 “现在为什么那个请求会有所不同?”我问自己。然后它发现我正在进行缓存,并且过时的缓存可以解释我今天早上看到的所有内容。

除了因为没有意识到这一点而感到有些羞辱之外,现在一切正常。

  

计算机科学中只有两件事:缓存失效和命名事物。    - Phil Karlton