WebSocket avec Java EE 7

585 vues

Publié le

Présentation de WebSocket, protocole de communication réellement bidirectionnel sur Internet, et mise en oeuvre avec son API Java de Java EE 7

Publié dans : Technologie
0 commentaire
1 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Nombre de vues
585
Sur SlideShare
0
Issues des intégrations
0
Intégrations
14
Actions
Partages
0
Téléchargements
36
Commentaires
0
J’aime
1
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

WebSocket avec Java EE 7

  1. 1. WebSocket avec Java EE 7 Florian Beaufumé 09/2015
  2. 2. Florian Beaufumé • Architecte logiciel • Spécialisé en Java et web • Freelance • florian.beaufume@adeliosys.fr • www.adeliosys.fr • www.linkedin.com/in/fbeaufume
  3. 3. • Protocole • Outils • API JavaScript du W3C • API Java de Java EE 7 • Retour d'expérience Sommaire
  4. 4. Protocole
  5. 5. Protocoles web WebSocket HTTP SPDY AJAX Comet HTTP/2 SSE Full-duplex for the web
  6. 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
  7. 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
  8. 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
  9. 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
  10. 10. Exemples de communication
  11. 11. Agar.io
  12. 12. • 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
  13. 13. • Chat basique : http://localhost:8080/chat/ Démonstration
  14. 14. • 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é
  15. 15. Outils
  16. 16. Chrome
  17. 17. Dark WebSocket Terminal
  18. 18. JMeter
  19. 19. Wireshark
  20. 20. API JavaScript
  21. 21. • HTML Code client du chat
  22. 22. • JavaScript Code client du chat
  23. 23. API JavaScript
  24. 24. API JavaScript
  25. 25. 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 … … …
  26. 26. API Java
  27. 27. • Endpoint WebSocket Code serveur du chat
  28. 28. • Endpoint WebSocket, avec canaux Code serveur du chat
  29. 29. • Définition d'un endpoint client ou serveur Endpoint programmatique
  30. 30. • Utilisations d'un endpoint • Cycle de vie : • Différent d'une servlet • Une instance par peer • Mono-thread Endpoint programmatique
  31. 31. • Définition et utilisation Endpoint serveur par annotation
  32. 32. • Similaire à un endpoint serveur • @ClientEndpoint plutôt que @ServerEndpoint, donc sans path Endpoint client par annotation
  33. 33. Session et RemoteEndpoint
  34. 34. Encoder et decoder
  35. 35. • Rétrocompatible • Amélioration pour les MessageHandler via lambdas API WebSocket 1.1
  36. 36. • 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
  37. 37. Retour d'expérience
  38. 38. KeyBout
  39. 39. • 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
  40. 40. • 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
  41. 41. Couches applicatives Games Game Results Endpoints Contrôleurs V1 Play PlayV3 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étierRéceptions Sécurité Session WS Emissions Session WS Emissions Réceptions Sécurité Réceptions Sécurité Session WS Emissions
  42. 42. • 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
  43. 43. • 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
  44. 44. florian.beaufume@adeliosys.fr www.adeliosys.fr www.linkedin.com/in/fbeaufume Merci

×