Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 终端IO在WAP/WAI应用程序中不工作_Haskell_Websocket_Io_Warp - Fatal编程技术网

Haskell 终端IO在WAP/WAI应用程序中不工作

Haskell 终端IO在WAP/WAI应用程序中不工作,haskell,websocket,io,warp,Haskell,Websocket,Io,Warp,我正在摆弄WebSocket,我已经编写了一个“echo服务器”,我希望它在运行时登录到控制台: echo = Warp.run 3000 app where app = WS.websocketsOr WS.defaultConnectionOptions wsApp httpApp httpApp _ respond = do put "HTTP Request Recieved" respond $ Wai

我正在摆弄WebSocket,我已经编写了一个“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
但没别的了。尽管我可以成功地在浏览器中加载“web/index.html”,并成功地建立到WebSocket的连接并使用它,但我没有从控制台得到任何反馈

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


图书馆版本:

  • :3.2.13
  • :3.2.1.1
  • :3.0.1.1
  • WebSocket:0.12.2.0

上述代码实际上是有效的,但当什么都没有发生时就不行了!这个问题是一个严重的缓存失效错误的结果,而不是我的代码中的错误

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

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

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

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

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

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

$ ./echoServer
Echo WebSocket Running ...