Терминал ввода-вывода не работает в приложении 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 и использовать его, я не получаю никаких отзывов от консоли.
Что мне нужно сделать, чтобы получить вывод на консоль?
Версии библиотеки:
- Деформация: 3.2.13
- WAI: 3.2.1.1
- wai-websockets: 3.0.1.1
- websockets: 0.12.2.0
1 ответ
Приведенный выше код на самом деле работает, но не тогда, когда ничего не происходит! Этот вопрос был результатом неприятной ошибки аннулирования кэша, а не ошибки в моем коде.
Сначала я написал на стороне клиента (настоятельно рекомендуется Elm) и жестко запрограммировал веб-сокет, чтобы он указывал на wss://echo.websocket.org
чтобы я мог проверить передний конец. Затем я получил бэкэнд, чтобы вручить мне файл, который создал Элм (но все же указал на wss://echo.websocket.org
). Осознав свою ошибку, я изменил сценарий elm так, чтобы он указывал на localhost, и добавил некоторую регистрацию в серверную часть, как показано выше.
Затем я перезапустил сервер и указал моему браузеру на localhost:3000. Браузер загрузил кэшированную копию (без HTTP-запроса), которая все еще указывала на wss://echo.websocket.org
(нет запроса веб-сокета).
Выглядело, как будто передний конец работал, но бэкэнд не регистрировался. На самом деле никаких запросов в бэкэнд вообще не было.
Я вернулся этим вечером и начал возиться с моим кодом, чтобы посмотреть, смогу ли я заставить все работать, и в первый раз, когда я запустил сервер, все (почти) заработало, но я не сделал никаких эффективных изменений, просто добавил несколько новых "include" линий. Срок действия кэша истек. Большой совет заключался в том, что все, кроме HTTP-запроса, регистрировалось правильно "Теперь, почему этот запрос будет другим?" Я спросил себя. Затем меня поразило, что происходит кеширование и что устаревший кеш может объяснить все, что я видел этим утром.
За исключением чувства унижения от того, что я не признал этого раньше, все работает сейчас.
В информатике есть только две сложные вещи: аннулирование кэша и именование. - Фил Карлтон