$30 off During Our Annual Pro Sale. View Details »

WebSocket avec Java EE 7

WebSocket avec Java EE 7

Présentation de WebSocket, protocole de communication réellement bidirectionnel pour le web, et mise en oeuvre de son API JavaScript dans le navigateur ainsi que l'API apportée par Java EE 7 dans le serveur.

Florian Beaufumé

September 01, 2015
Tweet

More Decks by Florian Beaufumé

Other Decks in Programming

Transcript

  1. WebSocket avec Java EE 7 Florian Beaufumé @fbeaufume 09/2015 v1.1

  2. Florian Beaufumé • Architecte logiciel et expert Java • Freelance

    • Brown bag lunch • @fbeaufume
  3. • Protocole • Outils • API JavaScript du W3C •

    API Java de Java EE 7 • Retour d'expérience Sommaire @fbeaufume
  4. Protocole @fbeaufume

  5. Protocoles web WebSocket HTTP SPDY AJAX Comet HTTP/2 SSE Full-duplex

    for the web @fbeaufume
  6. • HTTP 1.0 : • Sur TCP • Requête-réponse avec

    fermeture de connexion • HTTP 1.1 : • Keep-alive • AJAX : • Requêtes asynchrones • HTML ou data Historique @fbeaufume
  7. • Short polling : • Requêtes périodiques courtes sur le

    serveur • Comet : • Long polling : • Requêtes sur le serveur qui bloquent en attente de réponse • Streaming : • Requête longue sur le serveur avec plusieurs contenus retournés • Limitations : • Temps de requête/connexion • Overhead HTTP • Buffering des proxy Historique @fbeaufume
  8. • Server-Sent Event (SSE) : • Push uniquement, en texte,

    pas de streaming • SPDY : • HTTP amélioré par Google : compression des headers, multiplexage des requêtes, etc • Push de ressources (pas d'API JS de callback) • Upgradable en WebSocket • HTTP/2 : • Standard basé sur SPDY : compression, multiplexage, upgradable en WebSocket, etc • Push de ressources Historique @fbeaufume
  9. • Protocole de communication full-duplex sur connexion TCP • RFC

    6455 • Texte ou binaire • Crypté ("wss:") ou pas ("ws:") • Web friendly : • Upgrade d'HTTP ou indépendant • API JavaScript par W3C • Supporté par les browsers : Ch 16, FF 11, IE 10, Saf 6 • Sous-protocoles, e.g. XMPP, STOMP, SIP • Cible : applications temps réel, event-driven • Bénéfices : réduction de bande passante et latence WebSocket @fbeaufume
  10. Exemples de communication @fbeaufume

  11. • JavaScript : • API JavaScript standard du W3C •

    SocksJS : émulation WebSocket • Socket.io : wrapper WebSocket, AJAX long-polling, etc, utilisable aussi sur Node.js • Java : • Les API propriétaires des serveurs d'application • Java API for WebSocket 1.0 (JSR 356, dans Java EE 7) • Spring : fallback transparent sur SocksJS • Atmosphere : framework Java et JS supportant Comet, SSE, WebSocket, etc. API @fbeaufume
  12. • Chat basique : http://localhost:8080/chat/ Démonstration @fbeaufume

  13. • Cryptage via "wss:" • Authentification : • Pas de

    mécanisme spécifique • Solutions HTTP possibles, par ex cookies • Ou par message applicatif • Pas de Same-Origin Policy • Cross-Site WebSocket Hijacking (CSWSH) : • Similaire à CSRF • Vérifier le header "Origin" • Générer un token aléatoire pour l'upgrade Sécurité
  14. Outils @fbeaufume

  15. Chrome @fbeaufume

  16. Dark WebSocket Terminal @fbeaufume

  17. JMeter @fbeaufume

  18. Wireshark @fbeaufume

  19. API JavaScript @fbeaufume

  20. • HTML Code client du chat @fbeaufume

  21. • JavaScript Code client du chat @fbeaufume

  22. API JavaScript @fbeaufume

  23. API JavaScript @fbeaufume

  24. Codes de fermeture Code Nom Description 0-999 Réservés 1000 CLOSE_NORMAL

    Fermeture normale 1002 CLOSE_PROTOCOL_ERROR Erreur de protocole 1003 CLOSE_UNSUPPORTED Type de message pas supporté 1009 CLOSE_TOO_LARGE Data frame trop grosse 3000-3999 Pour les librairies et frameworks 4000-4999 Pour les applications … … … @fbeaufume
  25. API Java @fbeaufume

  26. • Endpoint WebSocket Code serveur du chat @fbeaufume

  27. • Endpoint WebSocket, avec canaux Code serveur du chat @fbeaufume

  28. • Définition d'un endpoint client ou serveur Endpoint programmatique @fbeaufume

  29. • Utilisations d'un endpoint • Cycle de vie : •

    Différent d'une servlet • Une instance par peer • Mono-thread Endpoint programmatique @fbeaufume
  30. • Définition et utilisation Endpoint serveur par annotation @fbeaufume

  31. • Similaire à un endpoint serveur • @ClientEndpoint plutôt que

    @ServerEndpoint, donc sans path Endpoint client par annotation @fbeaufume
  32. Session et RemoteEndpoint @fbeaufume

  33. Encoder et decoder @fbeaufume

  34. • Rétrocompatible • Amélioration pour les MessageHandler via lambdas API

    WebSocket 1.1 @fbeaufume
  35. • Cible Java EE 8 • Pas encore final •

    Améliorations envisagées : • Support des scopes CDI • API bas niveau pour gérer les frames • Amélioration des extensions • API de filtrage • Amélioration sur les sous-protocoles • API cliente : support de proxy, modes d'AH HTTP, etc. • Broadcast • Sécurité, par exemple @RolesAllowed • Cluster • Etc. API WebSocket.NEXT @fbeaufume
  36. Retour d'expérience @fbeaufume

  37. KeyBout @fbeaufume

  38. • http://www-adeliosys.rhcloud.com/keybout/ • 10 pages HTML Conception JSP CDI WebSocket

    JSON-P HTML Bootstrap JavaScript WebSocket Browser Serveur d'application Java EE 7 @fbeaufume
  39. • Client vers serveur : actions en texte, exemples :

    • create-game Capture English 2 10 • join-game Tom • claim-word 42 Coalition • Serveur vers client : notifications en JSON, exemple : • { "type":"games-list", "list":[ { "creator":"Tom", "type":"Capture", "language":"English", "rounds":2, "words":10, "guests":[ ] } ] } Messages @fbeaufume
  40. Couches applicatives Games Game Results Endpoints Contrôleurs V1 Play Play

    V3 Services Games Games Games Game Results Games Game Results V2 Games Games Game Results Play Games Game Results Pages /games /game/{id} /results/{id} /games /game/{id} /results/{id} /play Métier Métier Métier Réceptions Sécurité Session WS Emissions Session WS Emissions Réceptions Sécurité Réceptions Sécurité Session WS Emissions @fbeaufume
  41. • Pas lié à WebSocket mais au push : •

    Besoin d'indentification et catégorisation des clients • Plusieurs états à coordonner : • Session HTTP • Session WebSocket • Etat applicatif • Web vs WebSocket : manque de solutions intégrées à ce jour Impacts sur la conception @fbeaufume
  42. • Un path d'endpoint WebSocket doit commencer par "/", pas

    nécessaire pour JAX-RS • WildFly 8.0.0 : codes d'erreur pas supportés (corrigé en 8.1.0) • Quelques limitations d'héritage • Injection de @Singleton ok, mais pas @RequestScoped • Clustering pas spécifié : • Load-balancing, réplication de session, fail-over ? • L'API Spring semble aller plus loin API Java @fbeaufume
  43. Merci @fbeaufume