Tutoriel: ajouter la version client/serveur #
Regrouper les déclarations communes #
-
Dans le paquet
commun, créer la classeDeclarations -
S’assurer d’avoir l’arborescence suivante:
-
Ouvrir
AppPongdans le but d’en extraire les déclarations- on va les transférer dans des méthodes statiques de
Declarations
- on va les transférer dans des méthodes statiques de
Extraire la déclaration des messages #
-
Dans
AppPong, sélectionner l’intérieur de la méthoderegisterMessages -
Faire Ctrl+Shift+R => Extract to method pour ce code
-
Nommer cette méthode
declarerMessages:
-
Ajuster la signature de la nouvelle méthode
declarerMessagepour qu’elle soitpublic staticpublic static void declarerMessages(MessageRegistrar registrar) { -
Placer mon curseur sur la nouvelle méthode
declarerMessage -
Faire Ctrl+Shift+R => move method pour déplacer la méthode dans
Declarations
Extraire la déclaration des modèles #
-
Dans
AppPong, sélectionner l’intérieur de la méthoderegisterModels -
Faire Ctrl+Shift+R => extract method pour ce code
-
Nommer cette méthode
declarerModeles
-
Ajuster la signature de la nouvelle méthode
declarerModelespour qu’elle soitpublic staticpublic static void declarerModeles(ModelRegistrar registrar) { -
Placer mon curseur sur la nouvelle méthode
declarerModeles -
Avec Ctrl+Shift+R => move pour déplacer la méthode dans
Declarations
Vérifier #
-
Je devrais maintenant avoir à peu près ce code dans
AppPongpublic class AppPong implements NtroAppFx { public static void main(String[] args) { NtroAppFx.launch(args); } @Override public void registerFrontend(FrontendRegistrarFx registrar) { registrar.registerFrontend(FrontalPong.class); } @Override public void registerMessages(MessageRegistrar registrar) { Declarations.declarerMessages(registrar); } @Override public void registerModels(ModelRegistrar registrar) { Declarations.declarerModeles(registrar); } @Override public void registerBackend(BackendRegistrar registrar) { registrar.registerBackend(DorsalPong.class); } } -
Je devrais maintenant avoir à peu près ce code dans
Declarationspublic class Declarations { public static void declarerMessages(MessageRegistrar registrar) { registrar.registerMessage(MsgAjouterRendezVous.class); registrar.registerMessage(MsgRetirerRendezVous.class); registrar.registerMessage(MsgAjouterPoint.class); } public static void declarerModeles(ModelRegistrar registrar) { registrar.registerModel(ModeleFileAttente.class); registrar.registerValue(RendezVous.class); registrar.registerValue(RendezVousComplet.class); registrar.registerModel(ModelePartie.class); } } -
Je peux encore exécuter l’application
$ sh gradlew pong
Créer la version client/serveur #
-
Dans
dorsal, créer la classeDorsalPongDistant -
S’assurer d’avoir l’arborescence suivante:
-
Ouvrir
DorsalPongDistantet ajouter ce code:public class DorsalPongDistant extends RemoteBackendNtro { @Override public void registerServer(ServerRegistrar registrar) { Declarations.declarerServeur(registrar); } } -
Avec Ctrl+.Eclipse: Ctrl+1, créer la méthode
Declarations.declarerServeur -
Dans
Declarations, compléter le code de cette méthodepublic class Declarations { //... public static void declarerServeur(ServerRegistrar registrar) { // ajouter registrar.registerName("localhost"); // ajouter registrar.registerPort(8002); } } -
Dans le paquet
pong, créer la classeClientPong -
S’assurer d’avoir l’arborescence suivante:
-
Le code de
ClientPongdoit être comme celui deAppPong, sauf:public class ClientPong implements NtroClientFx { public static void main(String[] args) { NtroClientFx.launch(args); } @Override public void registerFrontend(FrontendRegistrarFx registrar) { registrar.registerFrontend(FrontalPong.class); } @Override public void registerModels(ModelRegistrar registrar) { Declarations.declarerModeles(registrar); } @Override public void registerMessages(MessageRegistrar registrar) { Declarations.declarerMessages(registrar); } // XXX: utiliser un dorsal distant @Override public void registerBackend(BackendRegistrar registrar) { registrar.registerBackend(DorsalPongDistant.class); } } -
Exécuter le client (devrais échouer sur une erreur de connexion)
$ sh gradlew pong:client # Devrait quitté sur une erreur [FATAL] failed to connect to ws://localhost:8002 [INFO] Exiting
Créer le serveur #
-
Dans
pong, ajouter la classeServeurPong -
S’assurer d’avoir l’arborescence suivante:
-
Ouvrir
ServeurPongajouter le code suivantpublic class ServeurPong implements NtroServerFx { public static void main(String[] args) { NtroServerFx.launch(args); } @Override public void registerMessages(MessageRegistrar registrar) { Declarations.declarerMessages(registrar); } @Override public void registerModels(ModelRegistrar registrar) { Declarations.declarerModeles(registrar); } @Override public void registerServer(ServerRegistrar registrar) { Declarations.declarerServeur(registrar); } @Override public void registerBackend(BackendRegistrar registrar) { registrar.registerBackend(DorsalPong.class); } }- NOTES
- c’est maintenant le serveur qui exécute le
DorsalPong«normal»
- c’est maintenant le serveur qui exécute le
- NOTES
Exécuter le serveur #
-
Exécuter le serveur
sh gradlew pong:serveur # devrait afficher [INFO] App running. Press Enter here to close App [INFO] Listening on ws://localhost:8002
Exécuter en mode client/serveur #
-
Avec le serveur qui roule, ouvrir un autre GitBash pour faire
$ sh gradlew pong:clientAlice # devrait maintenant afficher [INFO] connected to ws://localhost:8002 -
Avec le serveur et un premier client qui roulent, ouvrir un troisème GitBash pour faire
$ sh gradlew pong:clientBob -
Je devrais déjà voir que
ModeleFileAttenteest synchronisé via la serveur- NOTES
- toujours utiliser plusieurs GitBash pour lancer plusieurs programmes
- attendre que le serveur soit bien lancé avant de lancer un client
- attendre qu’un soit bien lancé avant d’en lancer un autre
- NOTES
-
En cas d’erreur du type
java.net.BindException: Adresse déjà utilisée, faire# ERREUR! java.net.BindException: Adresse déjà utilisée [FATAL] Cannot listen on ws://localhost:8002 Port already in use? # Faire $ sh gradlew --stop # Puis relancer le serveur $ sh gradlew pong:serveur
Vérifier qu’on peut toujours exécuter la version locale #
-
La version locale devrait toujours fonctionner
$ sh gradlew pong