2017-09-06 13 views
2

Je déconner avec WebSockets et j'ai écrit un « serveur d'écho » que je comptais ouvrir une session à la console comme il fonctionne:Terminal IO ne fonctionne pas dans l'application Chaîne/WAI

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 

Comme vous pouvez vois, j'ai essayé de tirer stdout mais sans succès. Je reçois

$ ./echoServer 
Echo WebSocket Running ... 

mais rien de plus. Même si je peux charger "web/index.html" avec succès dans un navigateur et établir avec succès une connexion au WebSocket et l'utiliser, je n'obtiens aucun retour de la part de la console.

Que dois-je faire pour obtenir une sortie sur la console?


Versions Bibliothèque:

Répondre

2

Le code ci-dessus fonctionne réellement, mais pas quand rien ne se passe! Cette question était le résultat d'une erreur d'invalidation de cache , et pas une erreur dans mon code.

J'ai écrit le côté client d'abord (en utilisant Elm, fortement recommandé) et codé en dur la websocket pour pointer vers wss://echo.websocket.org afin que je puisse tester l'extrémité avant. J'ai ensuite eu le backend pour me servir le fichier que Elm avait créé (mais toujours pointé au wss://echo.websocket.org). Réalisant mon erreur, j'ai changé le script de l'orme pour pointer sur localhost et ajouté un enregistrement au back-end comme vu ci-dessus. J'ai ensuite redémarré le serveur et pointé mon navigateur sur localhost: 3000. Le navigateur a chargé la copie mise en cache (pas de requête HTTP) qui pointait toujours sur wss://echo.websocket.org (pas de requête websocket).

Il semblait que le frontal fonctionnait, mais le backend ne se connectait pas. En fait, il n'y a pas eu de demandes du tout. Je suis revenu ce soir et j'ai commencé à jouer avec mon code pour voir si je pouvais tout faire fonctionner et la première fois que j'ai couru le serveur tout (presque) a fonctionné, mais je n'avais pas fait de changements efficaces, juste ajouté quelques nouvelles lignes 'include'. Le cache avait expiré. Le gros conseil était que tout sauf la requête HTTP se connectait correctement. "Maintenant, pourquoi cette requête serait-elle différente?" Je me suis demandé. Puis il m'a frappé qu'il y avait la mise en cache en cours et qu'un cache éventé pourrait expliquer tout ce que je voyais ce matin. En plus de se sentir un peu humilié de ne pas le reconnaître plus tôt, tout fonctionne maintenant.

Il y a seulement deux choses difficiles en informatique: l'invalidation du cache et le nommage. - Phil Karlton