2017-09-06 4 views
2

ワープ/ WAIアプリケーションで動作していないし、それが実行されるように私は私がコンソールにログインすると予想「echoサーバ」を書いた:ターミナルIOは、私はWebSocketをいじりだ

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への接続を確立して使用することはできますが、コンソールからのフィードバックは得られません。

コンソールに出力するには何が必要ですか?


ライブラリバージョン:

答えて

2

上記のコードは実際にはで動作しますが、何も起こらないときはありません!この質問は厄介なキャッシュ無効化エラーの結果であり、私のコードではエラーではありません。

私はフロントエンドをテストできるように、クライアント側を最初に(Elmを使用して、強く推奨)書いて、wss://echo.websocket.orgを指すようにハードコードしました。私はその後、Elmが作成したファイルを私に提供するためにバックエンドを手に入れました(しかし、まだwss://echo.websocket.orgを指していました)。私の間違いを認識して、elmスクリプトをlocalhostを指すように変更し、上記のようにバックエンドにいくつかのログを追加しました。

次に、サーバーを再起動し、ブラウザでlocalhost:3000を指定しました。ブラウザは、キャッシュされたコピー(HTTP要求なし)をロードし、依然としてwss://echo.websocket.org(WebSocket要求なし)を指していました。

フロントエンドが動作していたように見えましたが、バックエンドはログに記録されていませんでした。事実、バックエンドには何の要求もありませんでした。

私は今晩戻ってきて、すべてを稼働させることができるかどうかを知るためにコードを乱暴に始めました。サーバーを実行したときにはほとんど(ほとんど)働いていましたが、新しい 'include'行キャッシュの有効期限が切れました。大きなヒントは、HTTP要求以外のすべてが正しくログされていることでした。 "なぜ、その1つの要求が違うのですか?"私は自分自身に尋ねた。それから、キャッシュが続いていること、そして、古いキャッシュが、私が今朝見ていたすべてを説明できることが、私に打たれました。

これを以前には認識していないことに屈辱を感じる以外に、すべてが今働いています。

コンピュータサイエンスには、キャッシュの無効化と名前付けという2つの難しいことがあります。 - Phil Karlton

関連する問題