【问题标题】:Terminal IO not working in Warp / WAI application终端 IO 在 Warp / WAI 应用程序中不起作用
【发布时间】:2017-09-06 19:21:54
【问题描述】:

我在搞乱 WebSockets,我写了一个“回显服务器”,我希望它在运行时会登录到控制台:

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 ...

但仅此而已。即使我可以在浏览器中成功加载“web/index.html”并成功建立到 WebSocket 的连接并使用它,我也没有从控制台得到任何反馈。

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


库版本:

【问题讨论】:

    标签: haskell websocket io warp


    【解决方案1】:

    上面的代码确实有效,但当什么都没发生时就不行了!这个问题是 令人讨厌的 缓存失效错误的结果,而不是我的代码中的错误。

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

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

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

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

    除了因为没有早点意识到这一点而感到有点丢脸,现在一切正常。

    计算机科学中只有两件难事:缓存失效和命名。 ——菲尔·卡尔顿

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多