Терминал ввода-вывода не работает в приложении Warp / WAI

Я возиться с 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 и использовать его, я не получаю никаких отзывов от консоли.

Что мне нужно сделать, чтобы получить вывод на консоль?


Версии библиотеки:

1 ответ

Приведенный выше код на самом деле работает, но не тогда, когда ничего не происходит! Этот вопрос был результатом неприятной ошибки аннулирования кэша, а не ошибки в моем коде.

Сначала я написал на стороне клиента (настоятельно рекомендуется Elm) и жестко запрограммировал веб-сокет, чтобы он указывал на wss://echo.websocket.org чтобы я мог проверить передний конец. Затем я получил бэкэнд, чтобы вручить мне файл, который создал Элм (но все же указал на wss://echo.websocket.org). Осознав свою ошибку, я изменил сценарий elm так, чтобы он указывал на localhost, и добавил некоторую регистрацию в серверную часть, как показано выше.

Затем я перезапустил сервер и указал моему браузеру на localhost:3000. Браузер загрузил кэшированную копию (без HTTP-запроса), которая все еще указывала на wss://echo.websocket.org (нет запроса веб-сокета).

Выглядело, как будто передний конец работал, но бэкэнд не регистрировался. На самом деле никаких запросов в бэкэнд вообще не было.

Я вернулся этим вечером и начал возиться с моим кодом, чтобы посмотреть, смогу ли я заставить все работать, и в первый раз, когда я запустил сервер, все (почти) заработало, но я не сделал никаких эффективных изменений, просто добавил несколько новых "include" линий. Срок действия кэша истек. Большой совет заключался в том, что все, кроме HTTP-запроса, регистрировалось правильно "Теперь, почему этот запрос будет другим?" Я спросил себя. Затем меня поразило, что происходит кеширование и что устаревший кеш может объяснить все, что я видел этим утром.

За исключением чувства унижения от того, что я не признал этого раньше, все работает сейчас.

В информатике есть только две сложные вещи: аннулирование кэша и именование. - Фил Карлтон

Другие вопросы по тегам